From 44b6bd8219e4dc79d1fcdcaf9f4633bd3e32dbe8 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 2 Nov 2018 20:38:16 +0000 Subject: [PATCH] Deploy code docs to GitHub Pages for Appveyor build 1039 Commit: 3b3a4495378c51ea65e9327b30849b6b92dc2873 --- ...3___m_s_initial_create_8_designer_8cs.html | 120 ++ ..._initial_create_8_designer_8cs_source.html | 109 + 20180906135553___m_s_initial_create_8cs.html | 120 ++ ...35553___m_s_initial_create_8cs_source.html | 121 ++ ...9___m_y_initial_create_8_designer_8cs.html | 120 ++ ..._initial_create_8_designer_8cs_source.html | 109 + 20180906143029___m_y_initial_create_8cs.html | 120 ++ ...43029___m_y_initial_create_8cs_source.html | 121 ++ ...y_add_minimum_security_8_designer_8cs.html | 120 ++ ...inimum_security_8_designer_8cs_source.html | 109 + ...020726___m_y_add_minimum_security_8cs.html | 120 ++ ...__m_y_add_minimum_security_8cs_source.html | 113 + ...s_add_minimum_security_8_designer_8cs.html | 120 ++ ...inimum_security_8_designer_8cs_source.html | 109 + ...021228___m_s_add_minimum_security_8cs.html | 120 ++ ...__m_s_add_minimum_security_8cs_source.html | 113 + ...nd_foreign_key_cleanup_8_designer_8cs.html | 120 ++ ...ign_key_cleanup_8_designer_8cs_source.html | 109 + ..._nullable_and_foreign_key_cleanup_8cs.html | 120 ++ ...le_and_foreign_key_cleanup_8cs_source.html | 110 + ...nd_foreign_key_cleanup_8_designer_8cs.html | 120 ++ ...ign_key_cleanup_8_designer_8cs_source.html | 109 + ..._nullable_and_foreign_key_cleanup_8cs.html | 120 ++ ...le_and_foreign_key_cleanup_8cs_source.html | 110 + ...h_compile_job_required_8_designer_8cs.html | 120 ++ ...le_job_required_8_designer_8cs_source.html | 109 + ...m_s_reattach_compile_job_required_8cs.html | 120 ++ ...ttach_compile_job_required_8cs_source.html | 109 + ...h_compile_job_required_8_designer_8cs.html | 120 ++ ...le_job_required_8_designer_8cs_source.html | 109 + ...m_y_reattach_compile_job_required_8cs.html | 120 ++ ...ttach_compile_job_required_8cs_source.html | 109 + ArchitectureOverview.png | Bin 0 -> 159852 bytes _a_p_i_8dox.html | 99 + _administration_8cs.html | 119 ++ _administration_8cs_source.html | 107 + _administration_client_8cs.html | 119 ++ _administration_client_8cs_source.html | 117 ++ _administration_controller_8cs.html | 120 ++ _administration_controller_8cs_source.html | 145 ++ _administration_rights_8cs.html | 129 ++ _administration_rights_8cs_source.html | 112 + _administration_test_8cs.html | 119 ++ _administration_test_8cs_source.html | 120 ++ _api_client_8cs.html | 119 ++ _api_client_8cs_source.html | 132 ++ _api_client_factory_8cs.html | 119 ++ _api_client_factory_8cs_source.html | 114 + _api_conflict_exception_8cs.html | 120 ++ _api_conflict_exception_8cs_source.html | 117 ++ _api_controller_8cs.html | 120 ++ _api_controller_8cs_source.html | 136 ++ _api_headers_8cs.html | 120 ++ _api_headers_8cs_source.html | 112 + _api_mismatch_exception_8cs.html | 120 ++ _api_mismatch_exception_8cs_source.html | 117 ++ _api_validation_status_8cs.html | 129 ++ _api_validation_status_8cs_source.html | 113 + _application_8cs.html | 119 ++ _application_8cs_source.html | 215 ++ _application_builder_extensions_8cs.html | 120 ++ ...ication_builder_extensions_8cs_source.html | 113 + _architecture_8dox.html | 99 + _async_delayer_8cs.html | 119 ++ _async_delayer_8cs_source.html | 109 + _authentication_context_8cs.html | 120 ++ _authentication_context_8cs_source.html | 124 ++ _authentication_context_factory_8cs.html | 119 ++ ...entication_context_factory_8cs_source.html | 124 ++ _bool_converter_8cs.html | 120 ++ _bool_converter_8cs_source.html | 109 + _byond_8cs.html | 120 ++ _byond_8cs_source.html | 108 + _byond_client_8cs.html | 119 ++ _byond_client_8cs_source.html | 120 ++ _byond_command_8cs.html | 120 ++ _byond_command_8cs_source.html | 120 ++ _byond_controller_8cs.html | 120 ++ _byond_controller_8cs_source.html | 138 ++ _byond_executable_lock_8cs.html | 119 ++ _byond_executable_lock_8cs_source.html | 111 + _byond_manager_8cs.html | 119 ++ _byond_manager_8cs_source.html | 133 ++ _byond_rights_8cs.html | 128 ++ _byond_rights_8cs_source.html | 112 + _byond_test_8cs.html | 119 ++ _byond_test_8cs_source.html | 117 ++ _channel_8cs.html | 120 ++ _channel_8cs_source.html | 108 + _channel_mapping_8cs.html | 120 ++ _channel_mapping_8cs_source.html | 107 + _chat_8cs.html | 119 ++ _chat_8cs_source.html | 185 ++ _chat_bot_rights_8cs.html | 134 ++ _chat_bot_rights_8cs_source.html | 117 ++ _chat_bots_client_8cs.html | 119 ++ _chat_bots_client_8cs_source.html | 122 ++ _chat_command_8cs.html | 119 ++ _chat_command_8cs_source.html | 111 + _chat_connection_string_builder_8cs.html | 120 ++ ..._connection_string_builder_8cs_source.html | 106 + _chat_controller_8cs.html | 120 ++ _chat_controller_8cs_source.html | 142 ++ _chat_factory_8cs.html | 119 ++ _chat_factory_8cs_source.html | 127 ++ _chat_provider_8cs.html | 122 ++ _chat_provider_8cs_source.html | 108 + _claims_injector_8cs.html | 119 ++ _claims_injector_8cs_source.html | 127 ++ _client_exception_8cs.html | 120 ++ _client_exception_8cs_source.html | 117 ++ _comm_command_8cs.html | 120 ++ _comm_command_8cs_source.html | 107 + _comm_context_8cs.html | 119 ++ _comm_context_8cs_source.html | 127 ++ _command_factory_8cs.html | 119 ++ _command_factory_8cs_source.html | 134 ++ _components_2_watchdog_2_i_watchdog_8cs.html | 120 ++ ...ts_2_watchdog_2_i_watchdog_8cs_source.html | 116 ++ ...s_2_watchdog_2_i_watchdog_factory_8cs.html | 120 ++ ...chdog_2_i_watchdog_factory_8cs_source.html | 121 ++ ...2_watchdog_2_reattach_information_8cs.html | 120 ++ ...dog_2_reattach_information_8cs_source.html | 114 + _components_2_watchdog_2_watchdog_8cs.html | 119 ++ ...ents_2_watchdog_2_watchdog_8cs_source.html | 223 ++ ...nts_2_watchdog_2_watchdog_factory_8cs.html | 119 ++ ...atchdog_2_watchdog_factory_8cs_source.html | 138 ++ ...g_2_watchdog_reattach_information_8cs.html | 120 ++ ...chdog_reattach_information_8cs_source.html | 115 + _configuration_8cs.html | 119 ++ _configuration_8cs_source.html | 149 ++ _configuration_client_8cs.html | 119 ++ _configuration_client_8cs_source.html | 124 ++ _configuration_controller_8cs.html | 120 ++ _configuration_controller_8cs_source.html | 144 ++ _configuration_file_8cs.html | 120 ++ _configuration_file_8cs_source.html | 106 + _configuration_rights_8cs.html | 128 ++ _configuration_rights_8cs_source.html | 112 + _configuration_test_8cs.html | 119 ++ _configuration_test_8cs_source.html | 123 ++ _configuration_type_8cs.html | 123 ++ _configuration_type_8cs_source.html | 109 + _conflict_exception_8cs.html | 120 ++ _conflict_exception_8cs_source.html | 117 ++ _console_2_program_8cs.html | 120 ++ _console_2_program_8cs_source.html | 114 + _console_8cs.html | 119 ++ _console_8cs_source.html | 109 + _constants_8cs.html | 119 ++ _constants_8cs_source.html | 106 + _credentials_provider_8cs.html | 119 ++ _credentials_provider_8cs_source.html | 116 ++ _cryptography_suite_8cs.html | 119 ++ _cryptography_suite_8cs_source.html | 119 ++ _custom_command_8cs.html | 120 ++ _custom_command_8cs_source.html | 116 ++ _d_b_connection_factory_8cs.html | 119 ++ _d_b_connection_factory_8cs_source.html | 114 + _database_configuration_8cs.html | 120 ++ _database_configuration_8cs_source.html | 108 + _database_context_8cs.html | 119 ++ _database_context_8cs_source.html | 132 ++ _database_context_factory_8cs.html | 119 ++ _database_context_factory_8cs_source.html | 115 + _database_seeder_8cs.html | 119 ++ _database_seeder_8cs_source.html | 124 ++ _database_type_8cs.html | 123 ++ _database_type_8cs_source.html | 110 + _dead_session_controller_8cs.html | 120 ++ _dead_session_controller_8cs_source.html | 116 ++ _default_i_o_manager_8cs.html | 120 ++ _default_i_o_manager_8cs_source.html | 118 ++ ...n_time_db_context_factory_helpers_8cs.html | 120 ++ ...db_context_factory_helpers_8cs_source.html | 113 + _discord_connection_string_builder_8cs.html | 120 ++ ..._connection_string_builder_8cs_source.html | 114 + _discord_provider_8cs.html | 120 ++ _discord_provider_8cs_source.html | 134 ++ _dmb_factory_8cs.html | 120 ++ _dmb_factory_8cs_source.html | 140 ++ _dmb_provider_8cs.html | 119 ++ _dmb_provider_8cs_source.html | 125 ++ _dream_daemon_8cs.html | 120 ++ _dream_daemon_8cs_source.html | 113 + _dream_daemon_client_8cs.html | 119 ++ _dream_daemon_client_8cs_source.html | 120 ++ _dream_daemon_controller_8cs.html | 120 ++ _dream_daemon_controller_8cs_source.html | 154 ++ _dream_daemon_launch_parameters_8cs.html | 120 ++ ...m_daemon_launch_parameters_8cs_source.html | 113 + _dream_daemon_rights_8cs.html | 138 ++ _dream_daemon_rights_8cs_source.html | 120 ++ _dream_daemon_security_8cs.html | 123 ++ _dream_daemon_security_8cs_source.html | 109 + _dream_daemon_status_8cs.html | 123 ++ _dream_daemon_status_8cs_source.html | 109 + _dream_maker_client_8cs.html | 119 ++ _dream_maker_client_8cs_source.html | 124 ++ _dream_maker_controller_8cs.html | 120 ++ _dream_maker_controller_8cs_source.html | 148 ++ _dream_maker_rights_8cs.html | 131 ++ _dream_maker_rights_8cs_source.html | 115 + _dream_maker_settings_8cs.html | 119 ++ _dream_maker_settings_8cs_source.html | 108 + _error_message_8cs.html | 120 ++ _error_message_8cs_source.html | 109 + _event_consumer_8cs.html | 119 ++ _event_consumer_8cs_source.html | 122 ++ _event_notification_8cs.html | 120 ++ _event_notification_8cs_source.html | 108 + _event_type_8cs.html | 139 ++ _event_type_8cs_source.html | 120 ++ _file_logging_configuration_8cs.html | 120 ++ _file_logging_configuration_8cs_source.html | 108 + _general_configuration_8cs.html | 120 ++ _general_configuration_8cs_source.html | 109 + _git_hub_client_factory_8cs.html | 119 ++ _git_hub_client_factory_8cs_source.html | 113 + _global_suppressions_8cs.html | 105 + _global_suppressions_8cs_source.html | 104 + _home_controller_8cs.html | 120 ++ _home_controller_8cs_source.html | 142 ++ _http_client_8cs.html | 119 ++ _http_client_8cs_source.html | 111 + _i_administration_client_8cs.html | 120 ++ _i_administration_client_8cs_source.html | 111 + _i_api_client_8cs.html | 120 ++ _i_api_client_8cs_source.html | 112 + _i_api_client_factory_8cs.html | 120 ++ _i_api_client_factory_8cs_source.html | 111 + _i_application_8cs.html | 120 ++ _i_application_8cs_source.html | 108 + _i_async_delayer_8cs.html | 120 ++ _i_async_delayer_8cs_source.html | 107 + _i_authentication_context_8cs.html | 120 ++ _i_authentication_context_8cs_source.html | 117 ++ _i_authentication_context_factory_8cs.html | 120 ++ ...entication_context_factory_8cs_source.html | 108 + _i_byond_client_8cs.html | 120 ++ _i_byond_client_8cs_source.html | 111 + _i_byond_executable_lock_8cs.html | 120 ++ _i_byond_executable_lock_8cs_source.html | 109 + _i_byond_installer_8cs.html | 120 ++ _i_byond_installer_8cs_source.html | 108 + _i_byond_manager_8cs.html | 120 ++ _i_byond_manager_8cs_source.html | 110 + _i_chat_8cs.html | 120 ++ _i_chat_8cs_source.html | 115 + _i_chat_bots_client_8cs.html | 120 ++ _i_chat_bots_client_8cs_source.html | 111 + _i_chat_factory_8cs.html | 120 ++ _i_chat_factory_8cs_source.html | 116 ++ _i_claims_injector_8cs.html | 120 ++ _i_claims_injector_8cs_source.html | 107 + _i_comm_context_8cs.html | 120 ++ _i_comm_context_8cs_source.html | 109 + _i_comm_handler_8cs.html | 120 ++ _i_comm_handler_8cs_source.html | 108 + _i_command_8cs.html | 120 ++ _i_command_8cs_source.html | 108 + _i_command_factory_8cs.html | 120 ++ _i_command_factory_8cs_source.html | 107 + _i_compile_job_consumer_8cs.html | 120 ++ _i_compile_job_consumer_8cs_source.html | 113 + _i_configuration_8cs.html | 120 ++ _i_configuration_8cs_source.html | 116 ++ _i_configuration_client_8cs.html | 120 ++ _i_configuration_client_8cs_source.html | 111 + _i_console_8cs.html | 120 ++ _i_console_8cs_source.html | 107 + _i_credentials_provider_8cs.html | 120 ++ _i_credentials_provider_8cs_source.html | 108 + _i_cryptography_suite_8cs.html | 120 ++ _i_cryptography_suite_8cs_source.html | 110 + _i_custom_command_handler_8cs.html | 120 ++ _i_custom_command_handler_8cs_source.html | 108 + _i_d_b_connection_factory_8cs.html | 120 ++ _i_d_b_connection_factory_8cs_source.html | 111 + _i_database_context_8cs.html | 120 ++ _i_database_context_8cs_source.html | 110 + _i_database_context_factory_8cs.html | 120 ++ _i_database_context_factory_8cs_source.html | 110 + _i_database_seeder_8cs.html | 120 ++ _i_database_seeder_8cs_source.html | 108 + _i_dmb_factory_8cs.html | 120 ++ _i_dmb_factory_8cs_source.html | 112 + _i_dmb_provider_8cs.html | 120 ++ _i_dmb_provider_8cs_source.html | 112 + _i_dream_daemon_client_8cs.html | 120 ++ _i_dream_daemon_client_8cs_source.html | 111 + _i_dream_maker_8cs.html | 120 ++ _i_dream_maker_8cs_source.html | 112 + _i_dream_maker_client_8cs.html | 120 ++ _i_dream_maker_client_8cs_source.html | 112 + _i_event_consumer_8cs.html | 120 ++ _i_event_consumer_8cs_source.html | 108 + _i_git_hub_client_factory_8cs.html | 120 ++ _i_git_hub_client_factory_8cs_source.html | 107 + _i_http_client_8cs.html | 120 ++ _i_http_client_8cs_source.html | 108 + _i_i_o_manager_8cs.html | 120 ++ _i_i_o_manager_8cs_source.html | 107 + _i_identity_cache_8cs.html | 120 ++ _i_identity_cache_8cs_source.html | 112 + _i_instance_8cs.html | 120 ++ _i_instance_8cs_source.html | 131 ++ _i_instance_client_8cs.html | 120 ++ _i_instance_client_8cs_source.html | 123 ++ _i_instance_factory_8cs.html | 120 ++ _i_instance_factory_8cs_source.html | 108 + _i_instance_manager_8cs.html | 120 ++ _i_instance_manager_8cs_source.html | 112 + _i_instance_manager_client_8cs.html | 120 ++ _i_instance_manager_client_8cs_source.html | 114 + _i_instance_user_client_8cs.html | 120 ++ _i_instance_user_client_8cs_source.html | 111 + _i_job_manager_8cs.html | 120 ++ _i_job_manager_8cs_source.html | 114 + _i_jobs_client_8cs.html | 120 ++ _i_jobs_client_8cs_source.html | 111 + _i_json_tracking_context_8cs.html | 120 ++ _i_json_tracking_context_8cs_source.html | 113 + _i_network_prompt_reaper_8cs.html | 120 ++ _i_network_prompt_reaper_8cs_source.html | 110 + _i_platform_identifier_8cs.html | 120 ++ _i_platform_identifier_8cs_source.html | 106 + _i_post_write_handler_8cs.html | 119 ++ _i_post_write_handler_8cs_source.html | 106 + _i_process_8cs.html | 120 ++ _i_process_8cs_source.html | 108 + _i_process_base_8cs.html | 120 ++ _i_process_base_8cs_source.html | 108 + _i_process_executor_8cs.html | 120 ++ _i_process_executor_8cs_source.html | 107 + _i_provider_8cs.html | 120 ++ _i_provider_8cs_source.html | 108 + _i_provider_factory_8cs.html | 120 ++ _i_provider_factory_8cs_source.html | 116 ++ _i_reattach_info_handler_8cs.html | 120 ++ _i_reattach_info_handler_8cs_source.html | 108 + _i_repository_8cs.html | 120 ++ _i_repository_8cs_source.html | 113 + _i_repository_client_8cs.html | 120 ++ _i_repository_client_8cs_source.html | 111 + _i_repository_manager_8cs.html | 120 ++ _i_repository_manager_8cs_source.html | 109 + _i_request_logger_8cs.html | 120 ++ _i_request_logger_8cs_source.html | 107 + _i_restart_handler_8cs.html | 120 ++ _i_restart_handler_8cs_source.html | 107 + _i_restart_registration_8cs.html | 120 ++ _i_restart_registration_8cs_source.html | 108 + _i_server_8cs.html | 120 ++ _i_server_8cs_source.html | 107 + _i_server_client_8cs.html | 120 ++ _i_server_client_8cs_source.html | 117 ++ _i_server_client_factory_8cs.html | 120 ++ _i_server_client_factory_8cs_source.html | 112 + _i_server_control_8cs.html | 120 ++ _i_server_control_8cs_source.html | 113 + _i_server_factory_8cs.html | 120 ++ _i_server_factory_8cs_source.html | 107 + _i_session_controller_8cs.html | 120 ++ _i_session_controller_8cs_source.html | 116 ++ _i_session_controller_factory_8cs.html | 120 ++ _i_session_controller_factory_8cs_source.html | 119 ++ _i_setup_wizard_8cs.html | 120 ++ _i_setup_wizard_8cs_source.html | 107 + _i_symlink_factory_8cs.html | 120 ++ _i_symlink_factory_8cs_source.html | 107 + _i_synchronous_i_o_manager_8cs.html | 120 ++ _i_synchronous_i_o_manager_8cs_source.html | 107 + _i_system_identity_8cs.html | 120 ++ _i_system_identity_8cs_source.html | 108 + _i_system_identity_factory_8cs.html | 120 ++ _i_system_identity_factory_8cs_source.html | 111 + _i_token_factory_8cs.html | 120 ++ _i_token_factory_8cs_source.html | 110 + _i_users_client_8cs.html | 120 ++ _i_users_client_8cs_source.html | 112 + _identity_cache_8cs.html | 119 ++ _identity_cache_8cs_source.html | 127 ++ _identity_cache_object_8cs.html | 120 ++ _identity_cache_object_8cs_source.html | 118 ++ _instance_client_8cs.html | 119 ++ _instance_client_8cs_source.html | 135 ++ _instance_controller_8cs.html | 120 ++ _instance_controller_8cs_source.html | 173 ++ _instance_factory_8cs.html | 119 ++ _instance_factory_8cs_source.html | 170 ++ _instance_manager_8cs.html | 119 ++ _instance_manager_8cs_source.html | 136 ++ _instance_manager_client_8cs.html | 119 ++ _instance_manager_client_8cs_source.html | 126 ++ _instance_manager_rights_8cs.html | 134 ++ _instance_manager_rights_8cs_source.html | 117 ++ _instance_manager_test_8cs.html | 119 ++ _instance_manager_test_8cs_source.html | 127 ++ _instance_test_8cs.html | 119 ++ _instance_test_8cs_source.html | 116 ++ _instance_user_client_8cs.html | 119 ++ _instance_user_client_8cs_source.html | 122 ++ _instance_user_controller_8cs.html | 120 ++ _instance_user_controller_8cs_source.html | 147 ++ _instance_user_rights_8cs.html | 124 ++ _instance_user_rights_8cs_source.html | 111 + _insufficient_permissions_exception_8cs.html | 120 ++ ...ient_permissions_exception_8cs_source.html | 116 ++ _integration_test_8cs.html | 119 ++ _integration_test_8cs_source.html | 139 ++ _irc_connection_string_builder_8cs.html | 120 ++ ..._connection_string_builder_8cs_source.html | 116 ++ _irc_password_type_8cs.html | 123 ++ _irc_password_type_8cs_source.html | 108 + _irc_provider_8cs.html | 120 ++ _irc_provider_8cs_source.html | 139 ++ _job_controller_8cs.html | 120 ++ _job_controller_8cs_source.html | 133 ++ _job_exception_8cs.html | 120 ++ _job_exception_8cs_source.html | 111 + _job_handler_8cs.html | 120 ++ _job_handler_8cs_source.html | 112 + _job_manager_8cs.html | 119 ++ _job_manager_8cs_source.html | 146 ++ _jobs_client_8cs.html | 119 ++ _jobs_client_8cs_source.html | 122 ++ _json_file_8cs.html | 120 ++ _json_file_8cs_source.html | 112 + _json_sub_file_list_8cs.html | 120 ++ _json_sub_file_list_8cs_source.html | 112 + _json_tracking_context_8cs.html | 119 ++ _json_tracking_context_8cs_source.html | 132 ++ _kek_command_8cs.html | 120 ++ _kek_command_8cs_source.html | 109 + _launch_result_8cs.html | 120 ++ _launch_result_8cs_source.html | 107 + _message_8cs.html | 120 ++ _message_8cs_source.html | 108 + _method_not_supported_exception_8cs.html | 120 ++ ...od_not_supported_exception_8cs_source.html | 116 ++ _model_controller_8cs.html | 120 ++ _model_controller_8cs_source.html | 115 + _models_2_reattach_information_8cs.html | 120 ++ ...els_2_reattach_information_8cs_source.html | 109 + ...s_2_watchdog_reattach_information_8cs.html | 120 ++ ...chdog_reattach_information_8cs_source.html | 108 + _monitor_action_8cs.html | 128 ++ _monitor_action_8cs_source.html | 110 + _monitor_activation_reason_8cs.html | 130 ++ _monitor_activation_reason_8cs_source.html | 113 + _monitor_state_8cs.html | 120 ++ _monitor_state_8cs_source.html | 108 + _my_sql_database_context_8cs.html | 120 ++ _my_sql_database_context_8cs_source.html | 120 ++ ...l_database_context_model_snapshot_8cs.html | 119 ++ ...ase_context_model_snapshot_8cs_source.html | 114 + ...ql_design_time_db_context_factory_8cs.html | 119 ++ ...gn_time_db_context_factory_8cs_source.html | 115 + _native_methods_8cs.html | 120 ++ _native_methods_8cs_source.html | 108 + _platform_identifier_8cs.html | 119 ++ _platform_identifier_8cs_source.html | 109 + _posix_byond_installer_8cs.html | 120 ++ _posix_byond_installer_8cs_source.html | 125 ++ _posix_network_prompt_reaper_8cs.html | 119 ++ _posix_network_prompt_reaper_8cs_source.html | 112 + _posix_post_write_handler_8cs.html | 120 ++ _posix_post_write_handler_8cs_source.html | 109 + _posix_symlink_factory_8cs.html | 120 ++ _posix_symlink_factory_8cs_source.html | 108 + _posix_system_identity_factory_8cs.html | 120 ++ ...ix_system_identity_factory_8cs_source.html | 112 + _process_8cs.html | 119 ++ _process_8cs_source.html | 120 ++ _process_executor_8cs.html | 119 ++ _process_executor_8cs_source.html | 117 ++ _program_8cs.html | 120 ++ _program_8cs_source.html | 113 + _provider_8cs.html | 119 ++ _provider_8cs_source.html | 117 ++ _provider_factory_8cs.html | 119 ++ _provider_factory_8cs_source.html | 129 ++ _pull_requests_command_8cs.html | 120 ++ _pull_requests_command_8cs_source.html | 124 ++ _r_e_a_d_m_e_8md.html | 101 + _r_e_a_d_m_e_8md_source.html | 99 + _rate_limit_exception_8cs.html | 120 ++ _rate_limit_exception_8cs_source.html | 116 ++ _reattach_info_handler_8cs.html | 119 ++ _reattach_info_handler_8cs_source.html | 138 ++ _reattach_information_base_8cs.html | 120 ++ _reattach_information_base_8cs_source.html | 121 ++ _reboot_state_8cs.html | 123 ++ _reboot_state_8cs_source.html | 107 + _repository_client_8cs.html | 119 ++ _repository_client_8cs_source.html | 119 ++ _repository_controller_8cs.html | 120 ++ _repository_controller_8cs_source.html | 163 ++ _repository_manager_8cs.html | 119 ++ _repository_manager_8cs_source.html | 139 ++ _repository_rights_8cs.html | 139 ++ _repository_rights_8cs_source.html | 121 ++ _request_timeout_exception_8cs.html | 120 ++ _request_timeout_exception_8cs_source.html | 116 ++ _resolving_i_o_manager_8cs.html | 120 ++ _resolving_i_o_manager_8cs_source.html | 113 + _response_8cs.html | 120 ++ _response_8cs_source.html | 107 + _restart_registration_8cs.html | 119 ++ _restart_registration_8cs_source.html | 110 + _rev_info_test_merge_8cs.html | 120 ++ _rev_info_test_merge_8cs_source.html | 109 + _revision_command_8cs.html | 120 ++ _revision_command_8cs_source.html | 121 ++ _rights_helper_8cs.html | 120 ++ _rights_helper_8cs_source.html | 118 ++ _rights_type_8cs.html | 133 ++ _rights_type_8cs_source.html | 115 + _routes_8cs.html | 120 ++ _routes_8cs_source.html | 107 + _semaphore_slim_context_8cs.html | 120 ++ _semaphore_slim_context_8cs_source.html | 112 + _server_8cs.html | 119 ++ _server_8cs_source.html | 134 ++ _server_client_8cs.html | 119 ++ _server_client_8cs_source.html | 132 ++ _server_client_factory_8cs.html | 119 ++ _server_client_factory_8cs_source.html | 125 ++ _server_error_exception_8cs.html | 120 ++ _server_error_exception_8cs_source.html | 116 ++ _server_factory_8cs.html | 119 ++ _server_factory_8cs_source.html | 110 + _server_information_8cs.html | 120 ++ _server_information_8cs_source.html | 107 + _server_service_8cs.html | 120 ++ _server_service_8cs_source.html | 124 ++ _server_side_modifications_8cs.html | 120 ++ _server_side_modifications_8cs_source.html | 107 + _service_2_program_8cs.html | 120 ++ _service_2_program_8cs_source.html | 117 ++ _service_unavailable_exception_8cs.html | 120 ++ ...vice_unavailable_exception_8cs_source.html | 116 ++ _session_controller_8cs.html | 119 ++ _session_controller_8cs_source.html | 180 ++ _session_controller_factory_8cs.html | 119 ++ _session_controller_factory_8cs_source.html | 179 ++ _setup_wizard_8cs.html | 119 ++ _setup_wizard_8cs_source.html | 148 ++ _setup_wizard_mode_8cs.html | 124 ++ _setup_wizard_mode_8cs_source.html | 111 + _sql_server_database_context_8cs.html | 120 ++ _sql_server_database_context_8cs_source.html | 115 + ...r_database_context_model_snapshot_8cs.html | 119 ++ ...ase_context_model_snapshot_8cs_source.html | 114 + ...er_design_time_db_context_factory_8cs.html | 119 ++ ...gn_time_db_context_factory_8cs_source.html | 115 + _synchronous_i_o_manager_8cs.html | 119 ++ _synchronous_i_o_manager_8cs_source.html | 115 + _temporary_dmb_provider_8cs.html | 120 ++ _temporary_dmb_provider_8cs_source.html | 114 + _test_api_client_8cs.html | 119 ++ _test_api_client_8cs_source.html | 119 ++ _test_api_headers_8cs.html | 120 ++ _test_api_headers_8cs_source.html | 108 + _test_application_8cs.html | 124 ++ _test_application_8cs_source.html | 122 ++ _test_async_delayer_8cs.html | 119 ++ _test_async_delayer_8cs_source.html | 110 + _test_authentication_context_8cs.html | 120 ++ _test_authentication_context_8cs_source.html | 121 ++ _test_console_8cs.html | 119 ++ _test_console_8cs_source.html | 110 + _test_d_b_connection_factory_8cs.html | 119 ++ _test_d_b_connection_factory_8cs_source.html | 115 + _test_database_context_factory_8cs.html | 119 ++ ...t_database_context_factory_8cs_source.html | 115 + _test_discord_provider_8cs.html | 119 ++ _test_discord_provider_8cs_source.html | 116 ++ _test_dream_daemon_client_8cs.html | 119 ++ _test_dream_daemon_client_8cs_source.html | 117 ++ _test_git_hub_client_factory_8cs.html | 119 ++ _test_git_hub_client_factory_8cs_source.html | 112 + _test_irc_connection_string_builder_8cs.html | 119 ++ ..._connection_string_builder_8cs_source.html | 109 + _test_job_exception_8cs.html | 119 ++ _test_job_exception_8cs_source.html | 110 + _test_job_handler_8cs.html | 119 ++ _test_job_handler_8cs_source.html | 116 ++ _test_merge_base_8cs.html | 120 ++ _test_merge_base_8cs_source.html | 117 ++ _test_merge_parameters_8cs.html | 120 ++ _test_merge_parameters_8cs_source.html | 107 + _test_platform_identifier_8cs.html | 119 ++ _test_platform_identifier_8cs_source.html | 109 + _test_posix_byond_installer_8cs.html | 119 ++ _test_posix_byond_installer_8cs_source.html | 117 ++ _test_post_write_handler_8cs.html | 119 ++ _test_post_write_handler_8cs_source.html | 114 + _test_program_8cs.html | 119 ++ _test_program_8cs_source.html | 113 + _test_rights_8cs.html | 120 ++ _test_rights_8cs_source.html | 110 + _test_server_client_factory_8cs.html | 119 ++ _test_server_client_factory_8cs_source.html | 109 + _test_server_factory_8cs.html | 120 ++ _test_server_factory_8cs_source.html | 110 + _test_server_service_8cs.html | 120 ++ _test_server_service_8cs_source.html | 115 + _test_setup_wizard_8cs.html | 119 ++ _test_setup_wizard_8cs_source.html | 119 ++ _test_symlink_factory_8cs.html | 119 ++ _test_symlink_factory_8cs_source.html | 117 ++ _test_watchdog_factory_8cs.html | 120 ++ _test_watchdog_factory_8cs_source.html | 108 + _testing_server_8cs.html | 119 ++ _testing_server_8cs_source.html | 118 ++ _tgs_authorize_attribute_8cs.html | 120 ++ _tgs_authorize_attribute_8cs_source.html | 122 ++ ..._server_8_api_2_models_2_chat_bot_8cs.html | 119 ++ ..._8_api_2_models_2_chat_bot_8cs_source.html | 109 + ...ver_8_api_2_models_2_chat_channel_8cs.html | 120 ++ ...pi_2_models_2_chat_channel_8cs_source.html | 107 + ...rver_8_api_2_models_2_compile_job_8cs.html | 119 ++ ...api_2_models_2_compile_job_8cs_source.html | 109 + ...rver_8_api_2_models_2_dream_maker_8cs.html | 120 ++ ...api_2_models_2_dream_maker_8cs_source.html | 108 + ..._server_8_api_2_models_2_instance_8cs.html | 120 ++ ..._8_api_2_models_2_instance_8cs_source.html | 110 + ...er_8_api_2_models_2_instance_user_8cs.html | 120 ++ ...i_2_models_2_instance_user_8cs_source.html | 117 ++ ...pi_2_models_2_internal_2_chat_bot_8cs.html | 120 ++ ...dels_2_internal_2_chat_bot_8cs_source.html | 111 + ...2_models_2_internal_2_compile_job_8cs.html | 120 ++ ...s_2_internal_2_compile_job_8cs_source.html | 108 + ..._internal_2_dream_daemon_settings_8cs.html | 120 ++ ...al_2_dream_daemon_settings_8cs_source.html | 108 + ...r_8_api_2_models_2_internal_2_job_8cs.html | 120 ++ ..._2_models_2_internal_2_job_8cs_source.html | 111 + ..._2_internal_2_repository_settings_8cs.html | 120 ++ ...rnal_2_repository_settings_8cs_source.html | 107 + ...2_internal_2_revision_information_8cs.html | 120 ++ ...nal_2_revision_information_8cs_source.html | 107 + ..._2_models_2_internal_2_test_merge_8cs.html | 120 ++ ...ls_2_internal_2_test_merge_8cs_source.html | 108 + ..._8_api_2_models_2_internal_2_user_8cs.html | 120 ++ ...2_models_2_internal_2_user_8cs_source.html | 112 + ...ion_8_server_8_api_2_models_2_job_8cs.html | 120 ++ ...erver_8_api_2_models_2_job_8cs_source.html | 107 + ...erver_8_api_2_models_2_repository_8cs.html | 120 ++ ..._api_2_models_2_repository_8cs_source.html | 109 + ...i_2_models_2_revision_information_8cs.html | 119 ++ ...els_2_revision_information_8cs_source.html | 108 + ...erver_8_api_2_models_2_test_merge_8cs.html | 119 ++ ..._api_2_models_2_test_merge_8cs_source.html | 107 + ...on_8_server_8_api_2_models_2_user_8cs.html | 119 ++ ...rver_8_api_2_models_2_user_8cs_source.html | 106 + ...on_8_server_8_api_8_assembly_info_8cs.html | 105 + ...rver_8_api_8_assembly_info_8cs_source.html | 104 + ...ver_8_api_8_tests_8_assembly_info_8cs.html | 105 + ...pi_8_tests_8_assembly_info_8cs_source.html | 104 + ..._8_server_8_api_8_tests_8_program_8cs.html | 113 + ...er_8_api_8_tests_8_program_8cs_source.html | 106 + ...8_server_8_client_8_assembly_info_8cs.html | 105 + ...r_8_client_8_assembly_info_8cs_source.html | 104 + ..._8_client_8_tests_8_assembly_info_8cs.html | 105 + ...nt_8_tests_8_assembly_info_8cs_source.html | 104 + ...server_8_client_8_tests_8_program_8cs.html | 113 + ...8_client_8_tests_8_program_8cs_source.html | 106 + ...8_host_2_components_2_chat_2_user_8cs.html | 120 ++ ...2_components_2_chat_2_user_8cs_source.html | 108 + ...mponents_2_compiler_2_dream_maker_8cs.html | 119 ++ ...s_2_compiler_2_dream_maker_8cs_source.html | 158 ++ ...er_8_host_2_components_2_instance_8cs.html | 119 ++ ...st_2_components_2_instance_8cs_source.html | 202 ++ ...components_2_interop_2_test_merge_8cs.html | 120 ++ ...nts_2_interop_2_test_merge_8cs_source.html | 114 + ...ponents_2_repository_2_repository_8cs.html | 119 ++ ..._2_repository_2_repository_8cs_source.html | 145 ++ ...server_8_host_2_models_2_chat_bot_8cs.html | 119 ++ ...8_host_2_models_2_chat_bot_8cs_source.html | 108 + ...er_8_host_2_models_2_chat_channel_8cs.html | 119 ++ ...st_2_models_2_chat_channel_8cs_source.html | 110 + ...ver_8_host_2_models_2_compile_job_8cs.html | 119 ++ ...ost_2_models_2_compile_job_8cs_source.html | 111 + ..._2_models_2_dream_daemon_settings_8cs.html | 119 ++ ...ls_2_dream_daemon_settings_8cs_source.html | 108 + ...server_8_host_2_models_2_instance_8cs.html | 120 ++ ...8_host_2_models_2_instance_8cs_source.html | 112 + ...r_8_host_2_models_2_instance_user_8cs.html | 119 ++ ...t_2_models_2_instance_user_8cs_source.html | 115 + ...on_8_server_8_host_2_models_2_job_8cs.html | 119 ++ ...rver_8_host_2_models_2_job_8cs_source.html | 110 + ...st_2_models_2_repository_settings_8cs.html | 119 ++ ...dels_2_repository_settings_8cs_source.html | 112 + ...t_2_models_2_revision_information_8cs.html | 119 ++ ...els_2_revision_information_8cs_source.html | 109 + ...rver_8_host_2_models_2_test_merge_8cs.html | 119 ++ ...host_2_models_2_test_merge_8cs_source.html | 110 + ...n_8_server_8_host_2_models_2_user_8cs.html | 119 ++ ...ver_8_host_2_models_2_user_8cs_source.html | 109 + ...n_8_server_8_host_8_assembly_info_8cs.html | 105 + ...ver_8_host_8_assembly_info_8cs_source.html | 104 + ..._8_host_8_console_8_assembly_info_8cs.html | 105 + ..._8_console_8_assembly_info_8cs_source.html | 104 + ...8_console_8_tests_8_assembly_info_8cs.html | 105 + ...le_8_tests_8_assembly_info_8cs_source.html | 104 + ..._host_8_console_8_tests_8_program_8cs.html | 113 + ..._console_8_tests_8_program_8cs_source.html | 106 + ...rver_8_host_8_razor_assembly_info_8cs.html | 105 + ...host_8_razor_assembly_info_8cs_source.html | 104 + ...onents_2_watchdog_2_test_watchdog_8cs.html | 119 ++ ...2_watchdog_2_test_watchdog_8cs_source.html | 126 ++ ...er_8_host_8_tests_8_assembly_info_8cs.html | 105 + ...st_8_tests_8_assembly_info_8cs_source.html | 104 + ...8_server_8_host_8_tests_8_program_8cs.html | 113 + ...r_8_host_8_tests_8_program_8cs_source.html | 106 + ...8_host_8_watchdog_8_assembly_info_8cs.html | 105 + ...8_watchdog_8_assembly_info_8cs_source.html | 104 + ..._watchdog_8_tests_2_test_watchdog_8cs.html | 119 ++ ...og_8_tests_2_test_watchdog_8cs_source.html | 110 + ..._watchdog_8_tests_8_assembly_info_8cs.html | 105 + ...og_8_tests_8_assembly_info_8cs_source.html | 104 + ...host_8_watchdog_8_tests_8_program_8cs.html | 113 + ...watchdog_8_tests_8_program_8cs_source.html | 106 + ..._8_server_8_tests_8_assembly_info_8cs.html | 105 + ...er_8_tests_8_assembly_info_8cs_source.html | 104 + ...tation_8_server_8_tests_8_program_8cs.html | 113 + ...8_server_8_tests_8_program_8cs_source.html | 106 + _token_8cs.html | 120 ++ _token_8cs_source.html | 107 + _token_factory_8cs.html | 119 ++ _token_factory_8cs_source.html | 120 ++ _unauthorized_exception_8cs.html | 120 ++ _unauthorized_exception_8cs_source.html | 116 ++ _unrecognized_response_exception_8cs.html | 120 ++ ...ognized_response_exception_8cs_source.html | 117 ++ _updates_configuration_8cs.html | 120 ++ _updates_configuration_8cs_source.html | 107 + _user_controller_8cs.html | 120 ++ _user_controller_8cs_source.html | 148 ++ _user_update_8cs.html | 120 ++ _user_update_8cs_source.html | 107 + _users_client_8cs.html | 119 ++ _users_client_8cs_source.html | 121 ++ _version_command_8cs.html | 120 ++ _version_command_8cs_source.html | 115 + _watchdog_2_i_watchdog_8cs.html | 120 ++ _watchdog_2_i_watchdog_8cs_source.html | 108 + _watchdog_2_i_watchdog_factory_8cs.html | 120 ++ ...chdog_2_i_watchdog_factory_8cs_source.html | 107 + _watchdog_2_watchdog_8cs.html | 119 ++ _watchdog_2_watchdog_8cs_source.html | 113 + _watchdog_2_watchdog_factory_8cs.html | 119 ++ _watchdog_2_watchdog_factory_8cs_source.html | 110 + _watchdog_reattach_information_base_8cs.html | 120 ++ ..._reattach_information_base_8cs_source.html | 110 + _windows_byond_installer_8cs.html | 120 ++ _windows_byond_installer_8cs_source.html | 132 ++ _windows_network_prompt_reaper_8cs.html | 119 ++ ...dows_network_prompt_reaper_8cs_source.html | 137 ++ _windows_post_write_handler_8cs.html | 120 ++ _windows_post_write_handler_8cs_source.html | 109 + _windows_symlink_factory_8cs.html | 120 ++ _windows_symlink_factory_8cs_source.html | 112 + _windows_system_identity_8cs.html | 120 ++ _windows_system_identity_8cs_source.html | 114 + _windows_system_identity_factory_8cs.html | 120 ++ ...ws_system_identity_factory_8cs_source.html | 121 ++ annotated.html | 501 +++++ api.html | 361 ++++ architecture.html | 306 +++ arrowdown.png | Bin 0 -> 246 bytes arrowright.png | Bin 0 -> 229 bytes bc_s.png | Bin 0 -> 676 bytes bdwn.png | Bin 0 -> 147 bytes class_authorize_attribute.html | 114 + class_authorize_attribute.png | Bin 0 -> 1017 bytes class_auto_generated_program-members.html | 111 + class_auto_generated_program.html | 313 +++ class_controller.html | 116 ++ class_controller.png | Bin 0 -> 2123 bytes class_db_context.html | 114 + class_db_context.png | Bin 0 -> 1045 bytes class_exception.html | 126 ++ class_exception.png | Bin 0 -> 9718 bytes class_i_application_lifetime.html | 114 + class_i_application_lifetime.png | Bin 0 -> 1118 bytes class_i_design_time_db_context_factory.html | 115 + class_i_design_time_db_context_factory.png | Bin 0 -> 1777 bytes class_i_disposable.html | 142 ++ class_i_disposable.png | Bin 0 -> 24790 bytes class_i_event_log.html | 114 + class_i_event_log.png | Bin 0 -> 731 bytes class_i_hosted_service.html | 123 ++ class_i_hosted_service.png | Bin 0 -> 9021 bytes class_json_converter.html | 114 + class_json_converter.png | Bin 0 -> 1036 bytes class_migration.html | 121 ++ class_migration.png | Bin 0 -> 8011 bytes class_model_snapshot.html | 115 + class_model_snapshot.png | Bin 0 -> 1635 bytes class_service_base.html | 114 + class_service_base.png | Bin 0 -> 764 bytes ...erver_1_1_api_1_1_api_headers-members.html | 131 ++ ...on_1_1_server_1_1_api_1_1_api_headers.html | 875 ++++++++ ...1_1_models_1_1_administration-members.html | 113 + ...1_1_api_1_1_models_1_1_administration.html | 235 +++ ..._1_1_api_1_1_models_1_1_byond-members.html | 111 + ...1_server_1_1_api_1_1_models_1_1_byond.html | 178 ++ ...1_api_1_1_models_1_1_chat_bot-members.html | 117 ++ ...erver_1_1_api_1_1_models_1_1_chat_bot.html | 209 ++ ...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 | 115 + ...r_1_1_api_1_1_models_1_1_chat_channel.html | 301 +++ ...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 | 117 ++ ...er_1_1_api_1_1_models_1_1_compile_job.html | 233 +++ ...ver_1_1_api_1_1_models_1_1_compile_job.png | Bin 0 -> 1119 bytes ...models_1_1_configuration_file-members.html | 114 + ...api_1_1_models_1_1_configuration_file.html | 265 +++ ...ord_connection_string_builder-members.html | 114 + ...1_1_discord_connection_string_builder.html | 276 +++ ..._1_1_discord_connection_string_builder.png | Bin 0 -> 1386 bytes ...i_1_1_models_1_1_dream_daemon-members.html | 124 ++ ...r_1_1_api_1_1_models_1_1_dream_daemon.html | 329 +++ ...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 | 112 + ...er_1_1_api_1_1_models_1_1_dream_maker.html | 214 ++ ...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 | 111 + ..._1_1_api_1_1_models_1_1_error_message.html | 182 ++ ...1_api_1_1_models_1_1_instance-members.html | 117 ++ ...erver_1_1_api_1_1_models_1_1_instance.html | 351 ++++ ...server_1_1_api_1_1_models_1_1_instance.png | Bin 0 -> 910 bytes ..._1_1_models_1_1_instance_user-members.html | 117 ++ ..._1_1_api_1_1_models_1_1_instance_user.html | 353 ++++ ...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 | 115 + ..._1_1_models_1_1_internal_1_1_chat_bot.html | 300 +++ ...i_1_1_models_1_1_internal_1_1_chat_bot.png | Bin 0 -> 1391 bytes ...hat_connection_string_builder-members.html | 111 + ...al_1_1_chat_connection_string_builder.html | 197 ++ ...nal_1_1_chat_connection_string_builder.png | Bin 0 -> 1858 bytes ..._1_1_internal_1_1_compile_job-members.html | 114 + ...1_models_1_1_internal_1_1_compile_job.html | 275 +++ ..._1_models_1_1_internal_1_1_compile_job.png | Bin 0 -> 1553 bytes ...ream_daemon_launch_parameters-members.html | 115 + ...al_1_1_dream_daemon_launch_parameters.html | 315 +++ ...nal_1_1_dream_daemon_launch_parameters.png | Bin 0 -> 2801 bytes ...nal_1_1_dream_daemon_settings-members.html | 118 ++ ..._1_internal_1_1_dream_daemon_settings.html | 241 +++ ...1_1_internal_1_1_dream_daemon_settings.png | Bin 0 -> 2792 bytes ...1_models_1_1_internal_1_1_job-members.html | 117 ++ ...1_api_1_1_models_1_1_internal_1_1_job.html | 362 ++++ ..._1_api_1_1_models_1_1_internal_1_1_job.png | Bin 0 -> 1221 bytes ...ernal_1_1_repository_settings-members.html | 117 ++ ..._1_1_internal_1_1_repository_settings.html | 352 ++++ ...s_1_1_internal_1_1_repository_settings.png | Bin 0 -> 1725 bytes ...rnal_1_1_revision_information-members.html | 111 + ...1_1_internal_1_1_revision_information.html | 192 ++ ..._1_1_internal_1_1_revision_information.png | Bin 0 -> 1642 bytes ...s_1_1_internal_1_1_test_merge-members.html | 120 ++ ..._1_models_1_1_internal_1_1_test_merge.html | 223 ++ ...1_1_models_1_1_internal_1_1_test_merge.png | Bin 0 -> 3214 bytes ..._internal_1_1_test_merge_base-members.html | 118 ++ ...dels_1_1_internal_1_1_test_merge_base.html | 344 +++ ...odels_1_1_internal_1_1_test_merge_base.png | Bin 0 -> 3643 bytes ..._models_1_1_internal_1_1_user-members.html | 116 ++ ..._api_1_1_models_1_1_internal_1_1_user.html | 336 +++ ...1_api_1_1_models_1_1_internal_1_1_user.png | Bin 0 -> 1812 bytes ...irc_connection_string_builder-members.html | 119 ++ ...els_1_1_irc_connection_string_builder.html | 424 ++++ ...dels_1_1_irc_connection_string_builder.png | Bin 0 -> 1370 bytes ...er_1_1_api_1_1_models_1_1_job-members.html | 120 ++ ...1_1_server_1_1_api_1_1_models_1_1_job.html | 239 +++ ..._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 | 126 ++ ...ver_1_1_api_1_1_models_1_1_repository.html | 411 ++++ ...rver_1_1_api_1_1_models_1_1_repository.png | Bin 0 -> 1199 bytes ...dels_1_1_revision_information-members.html | 114 + ...i_1_1_models_1_1_revision_information.html | 222 ++ ...pi_1_1_models_1_1_revision_information.png | Bin 0 -> 1201 bytes ...models_1_1_server_information-members.html | 111 + ...api_1_1_models_1_1_server_information.html | 178 ++ ...api_1_1_models_1_1_test_merge-members.html | 121 ++ ...ver_1_1_api_1_1_models_1_1_test_merge.html | 201 ++ ...rver_1_1_api_1_1_models_1_1_test_merge.png | Bin 0 -> 2402 bytes ...els_1_1_test_merge_parameters-members.html | 112 + ..._1_1_models_1_1_test_merge_parameters.html | 224 ++ ...i_1_1_models_1_1_test_merge_parameters.png | Bin 0 -> 3648 bytes ...irc_connection_string_builder-members.html | 110 + ..._1_test_irc_connection_string_builder.html | 140 ++ ..._1_1_api_1_1_models_1_1_token-members.html | 111 + ...1_server_1_1_api_1_1_models_1_1_token.html | 182 ++ ...r_1_1_api_1_1_models_1_1_user-members.html | 119 ++ ..._1_server_1_1_api_1_1_models_1_1_user.html | 229 ++ ...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 | 120 ++ ...er_1_1_api_1_1_models_1_1_user_update.html | 197 ++ ...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 | 114 + ..._1_1_api_1_1_rights_1_1_rights_helper.html | 336 +++ ...hts_1_1_tests_1_1_test_rights-members.html | 110 + ..._1_1_rights_1_1_tests_1_1_test_rights.html | 146 ++ ...1_1_server_1_1_api_1_1_routes-members.html | 125 ++ ...station_1_1_server_1_1_api_1_1_routes.html | 510 +++++ ..._1_tests_1_1_test_api_headers-members.html | 111 + ..._1_api_1_1_tests_1_1_test_api_headers.html | 173 ++ ...ent_1_1_administration_client-members.html | 114 + ..._1_1_client_1_1_administration_client.html | 276 +++ ...r_1_1_client_1_1_administration_client.png | Bin 0 -> 927 bytes ...ver_1_1_client_1_1_api_client-members.html | 134 ++ ..._1_1_server_1_1_client_1_1_api_client.html | 1052 ++++++++++ ...n_1_1_server_1_1_client_1_1_api_client.png | Bin 0 -> 1087 bytes ...client_1_1_api_client_factory-members.html | 110 + ...ver_1_1_client_1_1_api_client_factory.html | 165 ++ ...rver_1_1_client_1_1_api_client_factory.png | Bin 0 -> 956 bytes ...nt_1_1_api_conflict_exception-members.html | 119 ++ ...1_1_client_1_1_api_conflict_exception.html | 289 +++ ..._1_1_client_1_1_api_conflict_exception.png | Bin 0 -> 1182 bytes ...nt_1_1_api_mismatch_exception-members.html | 119 ++ ...1_1_client_1_1_api_mismatch_exception.html | 277 +++ ..._1_1_client_1_1_api_mismatch_exception.png | Bin 0 -> 1324 bytes ...1_client_1_1_client_exception-members.html | 115 + ...erver_1_1_client_1_1_client_exception.html | 372 ++++ ...server_1_1_client_1_1_client_exception.png | Bin 0 -> 9461 bytes ...1_components_1_1_byond_client-members.html | 116 ++ ...lient_1_1_components_1_1_byond_client.html | 366 ++++ ...client_1_1_components_1_1_byond_client.png | Bin 0 -> 1105 bytes ...mponents_1_1_chat_bots_client-members.html | 119 ++ ...t_1_1_components_1_1_chat_bots_client.html | 490 +++++ ...nt_1_1_components_1_1_chat_bots_client.png | Bin 0 -> 1135 bytes ...ents_1_1_configuration_client-members.html | 120 ++ ...1_components_1_1_configuration_client.html | 554 +++++ ..._1_components_1_1_configuration_client.png | Bin 0 -> 1186 bytes ...nents_1_1_dream_daemon_client-members.html | 118 ++ ..._1_components_1_1_dream_daemon_client.html | 412 ++++ ...1_1_components_1_1_dream_daemon_client.png | Bin 0 -> 1201 bytes ...onents_1_1_dream_maker_client-members.html | 118 ++ ...1_1_components_1_1_dream_maker_client.html | 422 ++++ ..._1_1_components_1_1_dream_maker_client.png | Bin 0 -> 1200 bytes ...omponents_1_1_instance_client-members.html | 120 ++ ...nt_1_1_components_1_1_instance_client.html | 481 +++++ ...ent_1_1_components_1_1_instance_client.png | Bin 0 -> 1108 bytes ...ents_1_1_instance_user_client-members.html | 120 ++ ...1_components_1_1_instance_user_client.html | 521 +++++ ..._1_components_1_1_instance_user_client.png | Bin 0 -> 1179 bytes ..._1_components_1_1_jobs_client-members.html | 116 ++ ...client_1_1_components_1_1_jobs_client.html | 347 +++ ..._client_1_1_components_1_1_jobs_client.png | Bin 0 -> 1053 bytes ...ponents_1_1_repository_client-members.html | 118 ++ ..._1_1_components_1_1_repository_client.html | 448 ++++ ...t_1_1_components_1_1_repository_client.png | Bin 0 -> 1172 bytes ..._1_1_test_dream_daemon_client-members.html | 110 + ..._1_tests_1_1_test_dream_daemon_client.html | 145 ++ ...client_1_1_conflict_exception-members.html | 119 ++ ...ver_1_1_client_1_1_conflict_exception.html | 288 +++ ...rver_1_1_client_1_1_conflict_exception.png | Bin 0 -> 1141 bytes ...er_1_1_client_1_1_http_client-members.html | 114 + ...1_1_server_1_1_client_1_1_http_client.html | 277 +++ ..._1_1_server_1_1_client_1_1_http_client.png | Bin 0 -> 1072 bytes ...t_1_1_instance_manager_client-members.html | 120 ++ ..._1_client_1_1_instance_manager_client.html | 499 +++++ ...1_1_client_1_1_instance_manager_client.png | Bin 0 -> 1060 bytes ...ficient_permissions_exception-members.html | 118 ++ ..._1_insufficient_permissions_exception.html | 249 +++ ...1_1_insufficient_permissions_exception.png | Bin 0 -> 1468 bytes ...ethod_not_supported_exception-members.html | 118 ++ ...nt_1_1_method_not_supported_exception.html | 249 +++ ...ent_1_1_method_not_supported_exception.png | Bin 0 -> 1445 bytes ...ient_1_1_rate_limit_exception-members.html | 119 ++ ...r_1_1_client_1_1_rate_limit_exception.html | 279 +++ ...er_1_1_client_1_1_rate_limit_exception.png | Bin 0 -> 1159 bytes ...1_1_request_timeout_exception-members.html | 118 ++ ..._client_1_1_request_timeout_exception.html | 249 +++ ...1_client_1_1_request_timeout_exception.png | Bin 0 -> 1388 bytes ..._1_1_client_1_1_server_client-members.html | 121 ++ ...1_server_1_1_client_1_1_server_client.html | 486 +++++ ..._1_server_1_1_client_1_1_server_client.png | Bin 0 -> 1060 bytes ...ent_1_1_server_client_factory-members.html | 114 + ..._1_1_client_1_1_server_client_factory.html | 337 +++ ...r_1_1_client_1_1_server_client_factory.png | Bin 0 -> 923 bytes ...nt_1_1_server_error_exception-members.html | 119 ++ ...1_1_client_1_1_server_error_exception.html | 282 +++ ..._1_1_client_1_1_server_error_exception.png | Bin 0 -> 1225 bytes ...service_unavailable_exception-members.html | 118 ++ ...ent_1_1_service_unavailable_exception.html | 249 +++ ...ient_1_1_service_unavailable_exception.png | Bin 0 -> 1421 bytes ...1_1_tests_1_1_test_api_client-members.html | 111 + ..._client_1_1_tests_1_1_test_api_client.html | 170 ++ ..._1_test_server_client_factory-members.html | 110 + ..._tests_1_1_test_server_client_factory.html | 139 ++ ...nt_1_1_unauthorized_exception-members.html | 118 ++ ...1_1_client_1_1_unauthorized_exception.html | 249 +++ ..._1_1_client_1_1_unauthorized_exception.png | Bin 0 -> 1345 bytes ...recognized_response_exception-members.html | 119 ++ ...t_1_1_unrecognized_response_exception.html | 289 +++ ...nt_1_1_unrecognized_response_exception.png | Bin 0 -> 1455 bytes ...r_1_1_client_1_1_users_client-members.html | 118 ++ ..._1_server_1_1_client_1_1_users_client.html | 430 ++++ ...1_1_server_1_1_client_1_1_users_client.png | Bin 0 -> 846 bytes ...ond_1_1_byond_executable_lock-members.html | 115 + ...s_1_1_byond_1_1_byond_executable_lock.html | 322 +++ ...ts_1_1_byond_1_1_byond_executable_lock.png | Bin 0 -> 1699 bytes ...s_1_1_byond_1_1_byond_manager-members.html | 128 ++ ...omponents_1_1_byond_1_1_byond_manager.html | 790 +++++++ ...components_1_1_byond_1_1_byond_manager.png | Bin 0 -> 2280 bytes ...ond_1_1_posix_byond_installer-members.html | 123 ++ ...s_1_1_byond_1_1_posix_byond_installer.html | 564 +++++ ...ts_1_1_byond_1_1_posix_byond_installer.png | Bin 0 -> 1300 bytes ..._1_test_posix_byond_installer-members.html | 113 + ..._tests_1_1_test_posix_byond_installer.html | 197 ++ ...d_1_1_windows_byond_installer-members.html | 126 ++ ...1_1_byond_1_1_windows_byond_installer.html | 659 ++++++ ..._1_1_byond_1_1_windows_byond_installer.png | Bin 0 -> 1778 bytes ...mponents_1_1_chat_1_1_channel-members.html | 116 ++ ...t_1_1_components_1_1_chat_1_1_channel.html | 324 +++ ..._1_1_chat_1_1_channel_mapping-members.html | 114 + ...mponents_1_1_chat_1_1_channel_mapping.html | 261 +++ ..._components_1_1_chat_1_1_chat-members.html | 145 ++ ...host_1_1_components_1_1_chat_1_1_chat.html | 1415 +++++++++++++ ..._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 | 115 + ..._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 | 112 + ..._chat_1_1_commands_1_1_bool_converter.html | 231 ++ ...1_chat_1_1_commands_1_1_bool_converter.png | Bin 0 -> 1033 bytes ..._1_commands_1_1_byond_command-members.html | 116 ++ ...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 | 118 ++ ...chat_1_1_commands_1_1_command_factory.html | 421 ++++ ..._chat_1_1_commands_1_1_command_factory.png | Bin 0 -> 1352 bytes ...1_commands_1_1_custom_command-members.html | 115 + ..._chat_1_1_commands_1_1_custom_command.html | 334 +++ ...1_chat_1_1_commands_1_1_custom_command.png | Bin 0 -> 1287 bytes ..._1_1_commands_1_1_kek_command-members.html | 114 + ...1_1_chat_1_1_commands_1_1_kek_command.html | 275 +++ ..._1_1_chat_1_1_commands_1_1_kek_command.png | Bin 0 -> 1250 bytes ...nds_1_1_pull_requests_command-members.html | 118 ++ ..._1_commands_1_1_pull_requests_command.html | 423 ++++ ...1_1_commands_1_1_pull_requests_command.png | Bin 0 -> 1366 bytes ...commands_1_1_revision_command-members.html | 117 ++ ...hat_1_1_commands_1_1_revision_command.html | 385 ++++ ...chat_1_1_commands_1_1_revision_command.png | Bin 0 -> 1310 bytes ..._commands_1_1_version_command-members.html | 115 + ...chat_1_1_commands_1_1_version_command.html | 305 +++ ..._chat_1_1_commands_1_1_version_command.png | Bin 0 -> 1303 bytes ...hat_1_1_json_tracking_context-members.html | 122 ++ ...ts_1_1_chat_1_1_json_tracking_context.html | 529 +++++ ...nts_1_1_chat_1_1_json_tracking_context.png | Bin 0 -> 1708 bytes ...1_1_chat_1_1_provider_factory-members.html | 115 + ...ponents_1_1_chat_1_1_provider_factory.html | 301 +++ ...mponents_1_1_chat_1_1_provider_factory.png | Bin 0 -> 1279 bytes ...roviders_1_1_discord_provider-members.html | 127 ++ ...at_1_1_providers_1_1_discord_provider.html | 677 ++++++ ...hat_1_1_providers_1_1_discord_provider.png | Bin 0 -> 2344 bytes ..._1_providers_1_1_irc_provider-members.html | 138 ++ ...1_chat_1_1_providers_1_1_irc_provider.html | 1036 +++++++++ ..._1_chat_1_1_providers_1_1_irc_provider.png | Bin 0 -> 2230 bytes ...hat_1_1_providers_1_1_message-members.html | 111 + ...ts_1_1_chat_1_1_providers_1_1_message.html | 182 ++ ...at_1_1_providers_1_1_provider-members.html | 122 ++ ...s_1_1_chat_1_1_providers_1_1_provider.html | 549 +++++ ...ts_1_1_chat_1_1_providers_1_1_provider.png | Bin 0 -> 3179 bytes ...sts_1_1_test_discord_provider-members.html | 114 + ...s_1_1_tests_1_1_test_discord_provider.html | 229 ++ ...ponents_1_1_chat_1_1_response-members.html | 111 + ..._1_1_components_1_1_chat_1_1_response.html | 178 ++ ..._components_1_1_chat_1_1_user-members.html | 114 + ...host_1_1_components_1_1_chat_1_1_user.html | 263 +++ ..._1_1_compiler_1_1_dmb_factory-members.html | 129 ++ ...mponents_1_1_compiler_1_1_dmb_factory.html | 781 +++++++ ...omponents_1_1_compiler_1_1_dmb_factory.png | Bin 0 -> 2710 bytes ...1_1_compiler_1_1_dmb_provider-members.html | 119 ++ ...ponents_1_1_compiler_1_1_dmb_provider.html | 406 ++++ ...mponents_1_1_compiler_1_1_dmb_provider.png | Bin 0 -> 1539 bytes ..._1_1_compiler_1_1_dream_maker-members.html | 131 ++ ...mponents_1_1_compiler_1_1_dream_maker.html | 975 +++++++++ ...omponents_1_1_compiler_1_1_dream_maker.png | Bin 0 -> 1255 bytes ...er_1_1_temporary_dmb_provider-members.html | 116 ++ ...1_compiler_1_1_temporary_dmb_provider.html | 347 +++ ..._1_compiler_1_1_temporary_dmb_provider.png | Bin 0 -> 1669 bytes ...components_1_1_event_consumer-members.html | 114 + ...ost_1_1_components_1_1_event_consumer.html | 297 +++ ...host_1_1_components_1_1_event_consumer.png | Bin 0 -> 1150 bytes ...t_1_1_components_1_1_instance-members.html | 134 ++ ..._1_1_host_1_1_components_1_1_instance.html | 1065 ++++++++++ ...r_1_1_host_1_1_components_1_1_instance.png | Bin 0 -> 1816 bytes ...mponents_1_1_instance_factory-members.html | 131 ++ ...t_1_1_components_1_1_instance_factory.html | 875 ++++++++ ...st_1_1_components_1_1_instance_factory.png | Bin 0 -> 1524 bytes ...mponents_1_1_instance_manager-members.html | 126 ++ ...t_1_1_components_1_1_instance_manager.html | 654 ++++++ ...st_1_1_components_1_1_instance_manager.png | Bin 0 -> 1978 bytes ..._1_1_interop_1_1_chat_command-members.html | 112 + ...mponents_1_1_interop_1_1_chat_command.html | 192 ++ ..._1_1_interop_1_1_comm_command-members.html | 111 + ...mponents_1_1_interop_1_1_comm_command.html | 182 ++ ..._1_1_interop_1_1_comm_context-members.html | 120 ++ ...mponents_1_1_interop_1_1_comm_context.html | 499 +++++ ...omponents_1_1_interop_1_1_comm_context.png | Bin 0 -> 1528 bytes ...nts_1_1_interop_1_1_constants-members.html | 126 ++ ..._components_1_1_interop_1_1_constants.html | 426 ++++ ...nterop_1_1_event_notification-members.html | 111 + ...ts_1_1_interop_1_1_event_notification.html | 178 ++ ...nts_1_1_interop_1_1_json_file-members.html | 118 ++ ..._components_1_1_interop_1_1_json_file.html | 367 ++++ ...nterop_1_1_json_sub_file_list-members.html | 114 + ...ts_1_1_interop_1_1_json_sub_file_list.html | 295 +++ ...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 | 121 ++ ...components_1_1_interop_1_1_test_merge.html | 268 +++ ..._components_1_1_interop_1_1_test_merge.png | Bin 0 -> 1851 bytes ...nts_1_1_reattach_info_handler-members.html | 116 ++ ..._components_1_1_reattach_info_handler.html | 369 ++++ ...1_components_1_1_reattach_info_handler.png | Bin 0 -> 1334 bytes ...tory_1_1_credentials_provider-members.html | 112 + ...1_repository_1_1_credentials_provider.html | 230 ++ ..._1_repository_1_1_credentials_provider.png | Bin 0 -> 1400 bytes ...1_1_repository_1_1_repository-members.html | 142 ++ ...ponents_1_1_repository_1_1_repository.html | 1409 +++++++++++++ ...mponents_1_1_repository_1_1_repository.png | Bin 0 -> 1531 bytes ...sitory_1_1_repository_manager-members.html | 123 ++ ...1_1_repository_1_1_repository_manager.html | 631 ++++++ ..._1_1_repository_1_1_repository_manager.png | Bin 0 -> 1694 bytes ...tatic_files_1_1_configuration-members.html | 139 ++ ...ts_1_1_static_files_1_1_configuration.html | 1226 +++++++++++ ...nts_1_1_static_files_1_1_configuration.png | Bin 0 -> 3006 bytes ...1_1_server_side_modifications-members.html | 113 + ...c_files_1_1_server_side_modifications.html | 260 +++ ...g_1_1_dead_session_controller-members.html | 129 ++ ..._watchdog_1_1_dead_session_controller.html | 672 ++++++ ...1_watchdog_1_1_dead_session_controller.png | Bin 0 -> 2311 bytes ..._1_watchdog_1_1_launch_result-members.html | 112 + ...onents_1_1_watchdog_1_1_launch_result.html | 202 ++ ..._1_watchdog_1_1_monitor_state-members.html | 114 + ...onents_1_1_watchdog_1_1_monitor_state.html | 269 +++ ...1_posix_network_prompt_reaper-members.html | 110 + ...chdog_1_1_posix_network_prompt_reaper.html | 157 ++ ...tchdog_1_1_posix_network_prompt_reaper.png | Bin 0 -> 1488 bytes ...hdog_1_1_reattach_information-members.html | 125 ++ ...1_1_watchdog_1_1_reattach_information.html | 278 +++ ..._1_1_watchdog_1_1_reattach_information.png | Bin 0 -> 1958 bytes ...tchdog_1_1_session_controller-members.html | 149 ++ ...s_1_1_watchdog_1_1_session_controller.html | 1457 +++++++++++++ ...ts_1_1_watchdog_1_1_session_controller.png | Bin 0 -> 3103 bytes ..._1_session_controller_factory-members.html | 125 ++ ...tchdog_1_1_session_controller_factory.html | 757 +++++++ ...atchdog_1_1_session_controller_factory.png | Bin 0 -> 1433 bytes ...g_1_1_tests_1_1_test_watchdog-members.html | 111 + ..._watchdog_1_1_tests_1_1_test_watchdog.html | 166 ++ ...nts_1_1_watchdog_1_1_watchdog-members.html | 155 ++ ..._components_1_1_watchdog_1_1_watchdog.html | 1856 +++++++++++++++++ ...1_components_1_1_watchdog_1_1_watchdog.png | Bin 0 -> 3820 bytes ...watchdog_1_1_watchdog_factory-members.html | 117 ++ ...nts_1_1_watchdog_1_1_watchdog_factory.html | 435 ++++ ...ents_1_1_watchdog_1_1_watchdog_factory.png | Bin 0 -> 1278 bytes ...watchdog_reattach_information-members.html | 117 ++ ...dog_1_1_watchdog_reattach_information.html | 303 +++ ...hdog_1_1_watchdog_reattach_information.png | Bin 0 -> 1407 bytes ...windows_network_prompt_reaper-members.html | 124 ++ ...dog_1_1_windows_network_prompt_reaper.html | 587 ++++++ ...hdog_1_1_windows_network_prompt_reaper.png | Bin 0 -> 2408 bytes ...on_1_1_database_configuration-members.html | 115 + ...figuration_1_1_database_configuration.html | 295 +++ ..._1_file_logging_configuration-members.html | 116 ++ ...ration_1_1_file_logging_configuration.html | 324 +++ ...ion_1_1_general_configuration-members.html | 116 ++ ...nfiguration_1_1_general_configuration.html | 318 +++ ...ion_1_1_updates_configuration-members.html | 116 ++ ...nfiguration_1_1_updates_configuration.html | 316 +++ ..._host_1_1_console_1_1_program-members.html | 109 + ...rver_1_1_host_1_1_console_1_1_program.html | 118 ++ ...le_1_1_tests_1_1_test_program-members.html | 110 + ..._1_console_1_1_tests_1_1_test_program.html | 139 ++ ...1_1_administration_controller-members.html | 130 ++ ...rollers_1_1_administration_controller.html | 668 ++++++ ...trollers_1_1_administration_controller.png | Bin 0 -> 1309 bytes ...ontrollers_1_1_api_controller-members.html | 117 ++ ...st_1_1_controllers_1_1_api_controller.html | 420 ++++ ...ost_1_1_controllers_1_1_api_controller.png | Bin 0 -> 2111 bytes ...trollers_1_1_byond_controller-members.html | 120 ++ ..._1_1_controllers_1_1_byond_controller.html | 382 ++++ ...t_1_1_controllers_1_1_byond_controller.png | Bin 0 -> 1295 bytes ...ntrollers_1_1_chat_controller-members.html | 121 ++ ...t_1_1_controllers_1_1_chat_controller.html | 513 +++++ ...st_1_1_controllers_1_1_chat_controller.png | Bin 0 -> 1282 bytes ..._1_1_configuration_controller-members.html | 125 ++ ...trollers_1_1_configuration_controller.html | 595 ++++++ ...ntrollers_1_1_configuration_controller.png | Bin 0 -> 1294 bytes ...s_1_1_dream_daemon_controller-members.html | 124 ++ ...ntrollers_1_1_dream_daemon_controller.html | 541 +++++ ...ontrollers_1_1_dream_daemon_controller.png | Bin 0 -> 1313 bytes ...rs_1_1_dream_maker_controller-members.html | 121 ++ ...ontrollers_1_1_dream_maker_controller.html | 491 +++++ ...controllers_1_1_dream_maker_controller.png | Bin 0 -> 1399 bytes ...ntrollers_1_1_home_controller-members.html | 124 ++ ...t_1_1_controllers_1_1_home_controller.html | 457 ++++ ...st_1_1_controllers_1_1_home_controller.png | Bin 0 -> 1356 bytes ...llers_1_1_instance_controller-members.html | 128 ++ ...1_controllers_1_1_instance_controller.html | 771 +++++++ ..._1_controllers_1_1_instance_controller.png | Bin 0 -> 1303 bytes ..._1_1_instance_user_controller-members.html | 120 ++ ...trollers_1_1_instance_user_controller.html | 495 +++++ ...ntrollers_1_1_instance_user_controller.png | Bin 0 -> 1364 bytes ...ontrollers_1_1_job_controller-members.html | 118 ++ ...st_1_1_controllers_1_1_job_controller.html | 411 ++++ ...ost_1_1_controllers_1_1_job_controller.png | Bin 0 -> 1238 bytes ...trollers_1_1_model_controller-members.html | 123 ++ ..._1_1_controllers_1_1_model_controller.html | 497 +++++ ...t_1_1_controllers_1_1_model_controller.png | Bin 0 -> 1523 bytes ...ers_1_1_repository_controller-members.html | 126 ++ ...controllers_1_1_repository_controller.html | 694 ++++++ ..._controllers_1_1_repository_controller.png | Bin 0 -> 1273 bytes ...s_1_1_tgs_authorize_attribute-members.html | 119 ++ ...ntrollers_1_1_tgs_authorize_attribute.html | 398 ++++ ...ontrollers_1_1_tgs_authorize_attribute.png | Bin 0 -> 1015 bytes ...ntrollers_1_1_user_controller-members.html | 123 ++ ...t_1_1_controllers_1_1_user_controller.html | 559 +++++ ...st_1_1_controllers_1_1_user_controller.png | Bin 0 -> 1224 bytes ...host_1_1_core_1_1_application-members.html | 120 ++ ...ver_1_1_host_1_1_core_1_1_application.html | 569 +++++ ...rver_1_1_host_1_1_core_1_1_application.png | Bin 0 -> 908 bytes ...pplication_builder_extensions-members.html | 112 + ...re_1_1_application_builder_extensions.html | 241 +++ ...st_1_1_core_1_1_async_delayer-members.html | 110 + ...r_1_1_host_1_1_core_1_1_async_delayer.html | 165 ++ ...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 | 110 + ...t_1_1_core_1_1_d_b_connection_factory.html | 168 ++ ...st_1_1_core_1_1_d_b_connection_factory.png | Bin 0 -> 1149 bytes ..._1_1_database_context_factory-members.html | 112 + ...1_1_core_1_1_database_context_factory.html | 223 ++ ..._1_1_core_1_1_database_context_factory.png | Bin 0 -> 1214 bytes ...re_1_1_git_hub_client_factory-members.html | 114 + ...t_1_1_core_1_1_git_hub_client_factory.html | 276 +++ ...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 | 112 + ...r_1_1_host_1_1_core_1_1_job_exception.html | 224 ++ ...er_1_1_host_1_1_core_1_1_job_exception.png | Bin 0 -> 728 bytes ...host_1_1_core_1_1_job_handler-members.html | 116 ++ ...ver_1_1_host_1_1_core_1_1_job_handler.html | 333 +++ ...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 | 122 ++ ...ver_1_1_host_1_1_core_1_1_job_manager.html | 630 ++++++ ...rver_1_1_host_1_1_core_1_1_job_manager.png | Bin 0 -> 1622 bytes ..._core_1_1_platform_identifier-members.html | 112 + ...host_1_1_core_1_1_platform_identifier.html | 220 ++ ..._host_1_1_core_1_1_platform_identifier.png | Bin 0 -> 1021 bytes ...1_1_host_1_1_core_1_1_process-members.html | 124 ++ ..._server_1_1_host_1_1_core_1_1_process.html | 576 +++++ ...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 | 115 + ..._1_host_1_1_core_1_1_process_executor.html | 369 ++++ ...1_1_host_1_1_core_1_1_process_executor.png | Bin 0 -> 1006 bytes ...core_1_1_restart_registration-members.html | 112 + ...ost_1_1_core_1_1_restart_registration.html | 215 ++ ...host_1_1_core_1_1_restart_registration.png | Bin 0 -> 1413 bytes ...re_1_1_semaphore_slim_context-members.html | 115 + ...t_1_1_core_1_1_semaphore_slim_context.html | 340 +++ ...st_1_1_core_1_1_semaphore_slim_context.png | Bin 0 -> 914 bytes ...ost_1_1_core_1_1_setup_wizard-members.html | 127 ++ ...er_1_1_host_1_1_core_1_1_setup_wizard.html | 910 ++++++++ ...ver_1_1_host_1_1_core_1_1_setup_wizard.png | Bin 0 -> 948 bytes ..._1_tests_1_1_test_application-members.html | 111 + ...1_core_1_1_tests_1_1_test_application.html | 173 ++ ...1_1_mock_application_lifetime-members.html | 113 + ...ication_1_1_mock_application_lifetime.html | 201 ++ ...lication_1_1_mock_application_lifetime.png | Bin 0 -> 1114 bytes ...ication_1_1_mock_setup_wizard-members.html | 110 + ...est_application_1_1_mock_setup_wizard.html | 159 ++ ...test_application_1_1_mock_setup_wizard.png | Bin 0 -> 1292 bytes ..._tests_1_1_test_async_delayer-members.html | 111 + ...core_1_1_tests_1_1_test_async_delayer.html | 158 ++ ...1_test_d_b_connection_factory-members.html | 111 + ...tests_1_1_test_d_b_connection_factory.html | 160 ++ ...test_database_context_factory-members.html | 111 + ...sts_1_1_test_database_context_factory.html | 160 ++ ...1_test_git_hub_client_factory-members.html | 112 + ...tests_1_1_test_git_hub_client_factory.html | 175 ++ ..._tests_1_1_test_job_exception-members.html | 110 + ...core_1_1_tests_1_1_test_job_exception.html | 140 ++ ..._1_tests_1_1_test_job_handler-members.html | 116 ++ ...1_core_1_1_tests_1_1_test_job_handler.html | 297 +++ ..._1_1_test_platform_identifier-members.html | 110 + ..._1_tests_1_1_test_platform_identifier.html | 139 ++ ...1_tests_1_1_test_setup_wizard-members.html | 111 + ..._core_1_1_tests_1_1_test_setup_wizard.html | 162 ++ ..._1_1_host_1_1_i_o_1_1_console-members.html | 114 + ...1_server_1_1_host_1_1_i_o_1_1_console.html | 289 +++ ..._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 | 137 ++ ..._host_1_1_i_o_1_1_default_i_o_manager.html | 1142 ++++++++++ ...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 | 110 + ..._1_1_i_o_1_1_posix_post_write_handler.html | 158 ++ ...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 | 110 + ...ost_1_1_i_o_1_1_posix_symlink_factory.html | 172 ++ ...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 | 136 ++ ...ost_1_1_i_o_1_1_resolving_i_o_manager.html | 321 +++ ...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 | 116 ++ ...t_1_1_i_o_1_1_synchronous_i_o_manager.html | 360 ++++ ...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 | 111 + ...st_1_1_i_o_1_1_tests_1_1_test_console.html | 158 ++ ...s_1_1_test_post_write_handler-members.html | 112 + ...1_1_tests_1_1_test_post_write_handler.html | 181 ++ ...ests_1_1_test_symlink_factory-members.html | 115 + ..._o_1_1_tests_1_1_test_symlink_factory.html | 271 +++ ..._1_windows_post_write_handler-members.html | 110 + ..._1_i_o_1_1_windows_post_write_handler.html | 158 ++ ...1_1_i_o_1_1_windows_post_write_handler.png | Bin 0 -> 1154 bytes ...o_1_1_windows_symlink_factory-members.html | 110 + ...t_1_1_i_o_1_1_windows_symlink_factory.html | 172 ++ ...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 | 119 ++ ...rver_1_1_host_1_1_models_1_1_chat_bot.html | 258 +++ ...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 | 119 ++ ..._1_1_host_1_1_models_1_1_chat_channel.html | 258 +++ ...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 | 119 ++ ...r_1_1_host_1_1_models_1_1_compile_job.html | 286 +++ ...er_1_1_host_1_1_models_1_1_compile_job.png | Bin 0 -> 1121 bytes ...1_models_1_1_database_context-members.html | 131 ++ ..._host_1_1_models_1_1_database_context.html | 838 ++++++++ ...1_host_1_1_models_1_1_database_context.png | Bin 0 -> 1719 bytes ..._1_models_1_1_database_seeder-members.html | 114 + ...1_host_1_1_models_1_1_database_seeder.html | 317 +++ ..._1_host_1_1_models_1_1_database_seeder.png | Bin 0 -> 1113 bytes ...els_1_1_dream_daemon_settings-members.html | 123 ++ ..._1_1_models_1_1_dream_daemon_settings.html | 301 +++ ...t_1_1_models_1_1_dream_daemon_settings.png | Bin 0 -> 2091 bytes ...dels_1_1_dream_maker_settings-members.html | 116 ++ ...t_1_1_models_1_1_dream_maker_settings.html | 249 +++ ...st_1_1_models_1_1_dream_maker_settings.png | Bin 0 -> 1183 bytes ..._host_1_1_models_1_1_instance-members.html | 126 ++ ...rver_1_1_host_1_1_models_1_1_instance.html | 400 ++++ ...erver_1_1_host_1_1_models_1_1_instance.png | Bin 0 -> 908 bytes ..._1_1_models_1_1_instance_user-members.html | 122 ++ ...1_1_host_1_1_models_1_1_instance_user.html | 288 +++ ..._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 | 122 ++ ..._1_server_1_1_host_1_1_models_1_1_job.html | 300 +++ ...1_1_server_1_1_host_1_1_models_1_1_job.png | Bin 0 -> 909 bytes ...me_db_context_factory_helpers-members.html | 112 + ...esign_time_db_context_factory_helpers.html | 218 ++ ..._1_1_m_s_add_minimum_security-members.html | 112 + ...grations_1_1_m_s_add_minimum_security.html | 246 +++ ...igrations_1_1_m_s_add_minimum_security.png | Bin 0 -> 1054 bytes ...ations_1_1_m_s_initial_create-members.html | 112 + ...1_1_migrations_1_1_m_s_initial_create.html | 258 +++ ..._1_1_migrations_1_1_m_s_initial_create.png | Bin 0 -> 979 bytes ...lable_and_foreign_key_cleanup-members.html | 112 + ..._m_s_nullable_and_foreign_key_cleanup.html | 245 +++ ...1_m_s_nullable_and_foreign_key_cleanup.png | Bin 0 -> 1140 bytes ...reattach_compile_job_required-members.html | 112 + ...1_1_m_s_reattach_compile_job_required.html | 245 +++ ..._1_1_m_s_reattach_compile_job_required.png | Bin 0 -> 1104 bytes ..._1_1_m_y_add_minimum_security-members.html | 112 + ...grations_1_1_m_y_add_minimum_security.html | 246 +++ ...igrations_1_1_m_y_add_minimum_security.png | Bin 0 -> 1056 bytes ...ations_1_1_m_y_initial_create-members.html | 112 + ...1_1_migrations_1_1_m_y_initial_create.html | 258 +++ ..._1_1_migrations_1_1_m_y_initial_create.png | Bin 0 -> 975 bytes ...lable_and_foreign_key_cleanup-members.html | 112 + ..._m_y_nullable_and_foreign_key_cleanup.html | 245 +++ ...1_m_y_nullable_and_foreign_key_cleanup.png | Bin 0 -> 1133 bytes ...reattach_compile_job_required-members.html | 112 + ...1_1_m_y_reattach_compile_job_required.html | 245 +++ ..._1_1_m_y_reattach_compile_job_required.png | Bin 0 -> 1105 bytes ...tabase_context_model_snapshot-members.html | 110 + ...y_sql_database_context_model_snapshot.html | 157 ++ ...my_sql_database_context_model_snapshot.png | Bin 0 -> 1194 bytes ...esign_time_db_context_factory-members.html | 110 + ...my_sql_design_time_db_context_factory.html | 152 ++ ..._my_sql_design_time_db_context_factory.png | Bin 0 -> 1468 bytes ...tabase_context_model_snapshot-members.html | 110 + ...erver_database_context_model_snapshot.html | 157 ++ ...server_database_context_model_snapshot.png | Bin 0 -> 1197 bytes ...esign_time_db_context_factory-members.html | 110 + ...server_design_time_db_context_factory.html | 152 ++ ..._server_design_time_db_context_factory.png | Bin 0 -> 1515 bytes ...s_1_1_my_sql_database_context-members.html | 132 ++ ..._1_models_1_1_my_sql_database_context.html | 284 +++ ...1_1_models_1_1_my_sql_database_context.png | Bin 0 -> 1378 bytes ...dels_1_1_reattach_information-members.html | 124 ++ ...t_1_1_models_1_1_reattach_information.html | 235 +++ ...st_1_1_models_1_1_reattach_information.png | Bin 0 -> 1858 bytes ...1_1_reattach_information_base-members.html | 122 ++ ..._models_1_1_reattach_information_base.html | 401 ++++ ...1_models_1_1_reattach_information_base.png | Bin 0 -> 2684 bytes ...odels_1_1_repository_settings-members.html | 121 ++ ...st_1_1_models_1_1_repository_settings.html | 264 +++ ...ost_1_1_models_1_1_repository_settings.png | Bin 0 -> 1245 bytes ...odels_1_1_rev_info_test_merge-members.html | 112 + ...st_1_1_models_1_1_rev_info_test_merge.html | 205 ++ ...dels_1_1_revision_information-members.html | 117 ++ ...t_1_1_models_1_1_revision_information.html | 304 +++ ...st_1_1_models_1_1_revision_information.png | Bin 0 -> 1200 bytes ...1_sql_server_database_context-members.html | 132 ++ ...odels_1_1_sql_server_database_context.html | 280 +++ ...models_1_1_sql_server_database_context.png | Bin 0 -> 1377 bytes ...ost_1_1_models_1_1_test_merge-members.html | 125 ++ ...er_1_1_host_1_1_models_1_1_test_merge.html | 310 +++ ...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 | 125 ++ ...1_server_1_1_host_1_1_models_1_1_user.html | 431 ++++ ..._1_server_1_1_host_1_1_models_1_1_user.png | Bin 0 -> 929 bytes ...watchdog_reattach_information-members.html | 116 ++ ...els_1_1_watchdog_reattach_information.html | 256 +++ ...dels_1_1_watchdog_reattach_information.png | Bin 0 -> 1318 bytes ...dog_reattach_information_base-members.html | 112 + ..._1_watchdog_reattach_information_base.html | 234 +++ ...1_1_watchdog_reattach_information_base.png | Bin 0 -> 1927 bytes ...r_1_1_host_1_1_native_methods-members.html | 118 ++ ..._1_server_1_1_host_1_1_native_methods.html | 484 +++++ ...1_server_1_1_host_1_1_program-members.html | 110 + ...ation_1_1_server_1_1_host_1_1_program.html | 167 ++ ...ty_1_1_authentication_context-members.html | 116 ++ ...1_security_1_1_authentication_context.html | 362 ++++ ..._1_security_1_1_authentication_context.png | Bin 0 -> 1539 bytes ...uthentication_context_factory-members.html | 116 ++ ...ty_1_1_authentication_context_factory.html | 377 ++++ ...ity_1_1_authentication_context_factory.png | Bin 0 -> 1770 bytes ..._security_1_1_claims_injector-members.html | 113 + ...host_1_1_security_1_1_claims_injector.html | 282 +++ ..._host_1_1_security_1_1_claims_injector.png | Bin 0 -> 1093 bytes ...curity_1_1_cryptography_suite-members.html | 116 ++ ...t_1_1_security_1_1_cryptography_suite.html | 355 ++++ ...st_1_1_security_1_1_cryptography_suite.png | Bin 0 -> 1230 bytes ...1_security_1_1_identity_cache-members.html | 116 ++ ..._host_1_1_security_1_1_identity_cache.html | 360 ++++ ...1_host_1_1_security_1_1_identity_cache.png | Bin 0 -> 1450 bytes ...ity_1_1_identity_cache_object-members.html | 114 + ..._1_security_1_1_identity_cache_object.html | 308 +++ ...1_1_security_1_1_identity_cache_object.png | Bin 0 -> 937 bytes ...posix_system_identity_factory-members.html | 111 + ...ity_1_1_posix_system_identity_factory.html | 206 ++ ...rity_1_1_posix_system_identity_factory.png | Bin 0 -> 1301 bytes ...1_test_authentication_context-members.html | 111 + ...tests_1_1_test_authentication_context.html | 169 ++ ..._1_security_1_1_token_factory-members.html | 116 ++ ...1_host_1_1_security_1_1_token_factory.html | 367 ++++ ..._1_host_1_1_security_1_1_token_factory.png | Bin 0 -> 1073 bytes ...y_1_1_windows_system_identity-members.html | 118 ++ ..._security_1_1_windows_system_identity.html | 386 ++++ ...1_security_1_1_windows_system_identity.png | Bin 0 -> 1545 bytes ...ndows_system_identity_factory-members.html | 114 + ...y_1_1_windows_system_identity_factory.html | 329 +++ ...ty_1_1_windows_system_identity_factory.png | Bin 0 -> 1334 bytes ..._1_server_1_1_host_1_1_server-members.html | 124 ++ ...tation_1_1_server_1_1_host_1_1_server.html | 631 ++++++ ...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 | 110 + ..._1_server_1_1_host_1_1_server_factory.html | 167 ++ ...1_1_server_1_1_host_1_1_server_factory.png | Bin 0 -> 865 bytes ..._host_1_1_service_1_1_program-members.html | 118 ++ ...rver_1_1_host_1_1_service_1_1_program.html | 391 ++++ ..._1_service_1_1_server_service-members.html | 120 ++ ...1_host_1_1_service_1_1_server_service.html | 516 +++++ ..._1_host_1_1_service_1_1_server_service.png | Bin 0 -> 1136 bytes ...tests_1_1_test_server_service-members.html | 111 + ...ice_1_1_tests_1_1_test_server_service.html | 164 ++ ...tests_1_1_test_server_factory-members.html | 111 + ...ost_1_1_tests_1_1_test_server_factory.html | 162 ++ ...g_1_1_tests_1_1_test_watchdog-members.html | 110 + ..._watchdog_1_1_tests_1_1_test_watchdog.html | 139 ++ ...sts_1_1_test_watchdog_factory-members.html | 110 + ...g_1_1_tests_1_1_test_watchdog_factory.html | 143 ++ ...ost_1_1_watchdog_1_1_watchdog-members.html | 112 + ...er_1_1_host_1_1_watchdog_1_1_watchdog.html | 239 +++ ...ver_1_1_host_1_1_watchdog_1_1_watchdog.png | Bin 0 -> 859 bytes ...watchdog_1_1_watchdog_factory-members.html | 110 + ...ost_1_1_watchdog_1_1_watchdog_factory.html | 155 ++ ...host_1_1_watchdog_1_1_watchdog_factory.png | Bin 0 -> 1109 bytes ...tests_1_1_administration_test-members.html | 113 + ...ver_1_1_tests_1_1_administration_test.html | 233 +++ ...s_1_1_instance_1_1_byond_test-members.html | 115 + ...1_1_tests_1_1_instance_1_1_byond_test.html | 295 +++ ...stance_1_1_configuration_test-members.html | 115 + ...s_1_1_instance_1_1_configuration_test.html | 300 +++ ..._1_instance_1_1_instance_test-members.html | 112 + ..._tests_1_1_instance_1_1_instance_test.html | 197 ++ ...sts_1_1_instance_manager_test-members.html | 115 + ...r_1_1_tests_1_1_instance_manager_test.html | 298 +++ ..._1_tests_1_1_integration_test-members.html | 112 + ...server_1_1_tests_1_1_integration_test.html | 219 ++ ..._1_1_tests_1_1_testing_server-members.html | 116 ++ ...1_server_1_1_tests_1_1_testing_server.html | 316 +++ ..._1_server_1_1_tests_1_1_testing_server.png | Bin 0 -> 831 bytes classes.html | 209 ++ closed.png | Bin 0 -> 132 bytes dir_02f69155ced6ccca99a24744a5273903.html | 149 ++ dir_08963d262fa9e27215dce7b7c6e97f1b.html | 119 ++ dir_0c9add60ab05c04ed8367ecaedf67c01.html | 149 ++ dir_0de875c2ee7edd4009e892c5045f7b3a.html | 165 ++ dir_0e792d76844bf2d7c79795a56a50ebec.html | 109 + dir_0f5073360b9ba6d1522457c65eebe36a.html | 127 ++ dir_103b33cf1ab7043de6f87dfa61afa23f.html | 109 + dir_1302441b003a340c6a16c9bc1b51c94e.html | 125 ++ dir_13bee0ed20ecc83b9bcd4b869b726d42.html | 109 + dir_177c182c6d1f29bec543c3fdad3072d5.html | 109 + dir_18a5e30c14613227f95d12bd9fddc614.html | 109 + dir_1cebbc1bce26b60bfb2ee26c80f86b02.html | 109 + dir_2133157f8312226ef9ea4ce42a802cf8.html | 113 + dir_298f2a364723f4f4cea115538f944a94.html | 111 + dir_2ea2465064f3ff030c6dd6700a328d91.html | 120 ++ dir_34761767c1c3cd212f9d2f80ea0828a8.html | 140 ++ dir_383ca23c40357ede4cca827b4a365c76.html | 109 + dir_38cec1532eaed7aa1de0b599a76e3e80.html | 137 ++ dir_40138fd4849573e743490d583f6d06d6.html | 109 + dir_4122b363a9d577bed19bef337e757ff3.html | 109 + dir_446bdfc1cd19b69c11765b5665ebfd45.html | 109 + dir_4ddbd20a555bd1f3bf9569744c8989cc.html | 113 + dir_53aae571c66a052729f8e64ccc397130.html | 111 + dir_53c056aa6a96f034cca75f793964be6e.html | 109 + dir_59425e443f801f1f2fd8bbe4959a3ccf.html | 121 ++ dir_5d46d0c3fd1cac5ce1ea23751ad25792.html | 119 ++ dir_5d5b300b88421e3050db28dd037f6f39.html | 116 ++ dir_5e0b464d3b4be546c63c5188ffeb96e4.html | 115 + dir_61d7974a657c30011f457b376d274ee7.html | 166 ++ dir_68267d1309a1af8e8297ef4c3efbcdba.html | 119 ++ dir_685b5aa2d8a661ab5bc3f68b331887b0.html | 109 + dir_689f0584ee97ae9ca308532531d9c5d2.html | 109 + dir_6c60df807dd2523776d391746c262b4d.html | 143 ++ dir_6c8d8f20501e8e412458f542d0998195.html | 109 + dir_6db5af7fcfa17a34c7abf23e195af4db.html | 111 + dir_71f5cbd840fdd1dea9f035c7b1a066ee.html | 118 ++ dir_74017a19412e2f90cc6ad11fcac82495.html | 109 + dir_7916dda968fadc8673161597975e4c5d.html | 109 + dir_7a3fd032a1362a6005a1fc9227a8dd86.html | 146 ++ dir_7a9487ad1984d08627fcf919e6f3d801.html | 109 + dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html | 109 + dir_7ae0efc0613c36c848fa310214e0aee3.html | 109 + dir_7cd79c49f3850abc2141fa4adfdd1950.html | 127 ++ dir_83a6f600c846cd444f33e44bb9b4f9cb.html | 109 + dir_860acef72838dce8d3d54c8f98bc464b.html | 129 ++ dir_87a4f2035ed18e30422f4b60aebc4381.html | 109 + dir_900257602d294c4a4799e88420919068.html | 111 + dir_90400719279795a0c5ea912516a4c874.html | 109 + dir_91e2bbee1291fcb0db7e0417b617d01e.html | 109 + dir_9826fb2d31585a830723e6d7089b5d0e.html | 174 ++ dir_a01d946a2e1b048dc542232ffcdcf572.html | 118 ++ dir_a24b8c5f308a77f73e7a9e43c0f243d1.html | 109 + dir_a44a562b5a12ef1c8495ac1a63e915ea.html | 142 ++ dir_a536e49cdf631f66733cf2c9791144ce.html | 133 ++ dir_a99ad55e4d1fa76955df2299f3783cf0.html | 109 + dir_b0d0d898ef448ca0a6a170a2896fa60e.html | 121 ++ dir_b2c89c850c962495793d09ea3a2ee385.html | 111 + dir_b524b00ec2259c3c83b44909fd47f6e3.html | 109 + dir_b6324197f7ac56e30d6189c3a45eec56.html | 121 ++ dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html | 109 + dir_bb25b36c82def1362ea245058c866cdc.html | 109 + dir_be6161819238d55fa660c07ade960e53.html | 116 ++ dir_c2c4d4ee47e55233c6ea5db8b96422c6.html | 158 ++ dir_c5451d9d233744a5b09a29938f0cda9a.html | 143 ++ dir_c648ff9d1a57dd8752f4ab2a7c68712c.html | 109 + dir_c65d377d3c73fb4a07b3637f9c0caf4d.html | 109 + dir_c9d0608eee53bfffcc33d03463bbe2db.html | 113 + dir_d45f494620bc0048ee4a31fa4f7391e1.html | 111 + dir_d8869fc9da5c696ed284d5c470b7210f.html | 109 + dir_d88de13ae4b64d4d0766b0c06f1a9edf.html | 109 + dir_dbb0c65ea012faeef2906502dd42dfec.html | 114 + dir_df215ce6792635a450ba5a94b5a17942.html | 113 + dir_e0c1bccb03249d93bc42ac0968ce43fd.html | 109 + dir_e2ec88631ea78d6df8b37d27efa9bfe2.html | 118 ++ dir_e928c7e494884ad322b5f6005c2954e1.html | 111 + dir_e9975c2f0de13509bd9fb4e31ae732ab.html | 114 + dir_eb7c70823ae63176c38851687b13349d.html | 122 ++ dir_ed78ff3b0fc4a7f5234cdb0b34617476.html | 122 ++ dir_f0581cdd528a911f791df57d0f438bcb.html | 109 + dir_f0d41009ce252337feb2b68822c4cfba.html | 122 ++ dir_f2a82faa4c4beef364292694cefca86d.html | 129 ++ dir_fb12273b841438c2f2c9b5bc5398c636.html | 109 + dir_fcc41a8faa41492aba200a49fc7d0aed.html | 109 + doc.png | Bin 0 -> 746 bytes doxygen.css | 1475 +++++++++++++ doxygen.png | Bin 0 -> 3779 bytes dynsections.js | 104 + files.html | 574 +++++ folderclosed.png | Bin 0 -> 616 bytes folderopen.png | Bin 0 -> 597 bytes functions.html | 409 ++++ functions_0x7e.html | 146 ++ functions_b.html | 270 +++ functions_c.html | 758 +++++++ functions_d.html | 537 +++++ functions_e.html | 195 ++ functions_enum.html | 112 + functions_f.html | 170 ++ functions_func.html | 196 ++ functions_func_0x7e.html | 145 ++ functions_func_b.html | 174 ++ functions_func_c.html | 465 +++++ functions_func_d.html | 318 +++ functions_func_e.html | 162 ++ functions_func_f.html | 161 ++ functions_func_g.html | 268 +++ functions_func_h.html | 182 ++ functions_func_i.html | 235 +++ functions_func_j.html | 164 ++ functions_func_k.html | 144 ++ functions_func_l.html | 225 ++ functions_func_m.html | 187 ++ functions_func_n.html | 152 ++ functions_func_o.html | 169 ++ functions_func_p.html | 187 ++ functions_func_r.html | 352 ++++ functions_func_s.html | 323 +++ functions_func_t.html | 351 ++++ functions_func_u.html | 219 ++ functions_func_v.html | 158 ++ functions_func_w.html | 195 ++ functions_func_z.html | 143 ++ functions_g.html | 308 +++ functions_h.html | 229 ++ functions_i.html | 455 ++++ functions_j.html | 207 ++ functions_k.html | 148 ++ functions_l.html | 312 +++ functions_m.html | 244 +++ functions_n.html | 202 ++ functions_o.html | 208 ++ functions_p.html | 319 +++ functions_prop.html | 243 +++ functions_prop_b.html | 172 ++ functions_prop_c.html | 293 +++ functions_prop_d.html | 222 ++ functions_prop_e.html | 149 ++ functions_prop_f.html | 140 ++ functions_prop_g.html | 157 ++ functions_prop_h.html | 153 ++ functions_prop_i.html | 256 +++ functions_prop_j.html | 150 ++ functions_prop_l.html | 166 ++ functions_prop_m.html | 169 ++ functions_prop_n.html | 158 ++ functions_prop_o.html | 157 ++ functions_prop_p.html | 208 ++ functions_prop_r.html | 212 ++ functions_prop_s.html | 206 ++ functions_prop_t.html | 189 ++ functions_prop_u.html | 182 ++ functions_prop_v.html | 158 ++ functions_prop_w.html | 153 ++ functions_q.html | 143 ++ functions_r.html | 495 +++++ functions_s.html | 460 ++++ functions_t.html | 448 ++++ functions_u.html | 286 +++ functions_v.html | 186 ++ functions_vars.html | 255 +++ functions_vars_b.html | 203 ++ functions_vars_c.html | 276 +++ functions_vars_d.html | 288 +++ functions_vars_e.html | 155 ++ functions_vars_f.html | 144 ++ functions_vars_g.html | 156 ++ functions_vars_h.html | 169 ++ functions_vars_i.html | 239 +++ functions_vars_j.html | 166 ++ functions_vars_k.html | 141 ++ functions_vars_l.html | 190 ++ functions_vars_m.html | 161 ++ functions_vars_n.html | 165 ++ functions_vars_o.html | 159 ++ functions_vars_p.html | 199 ++ functions_vars_q.html | 141 ++ functions_vars_r.html | 220 ++ functions_vars_s.html | 204 ++ functions_vars_t.html | 185 ++ functions_vars_u.html | 168 ++ functions_vars_v.html | 151 ++ functions_vars_w.html | 160 ++ functions_w.html | 235 +++ functions_z.html | 144 ++ hierarchy.html | 492 +++++ index.html | 283 +++ ...components_1_1_i_byond_client-members.html | 112 + ...ent_1_1_components_1_1_i_byond_client.html | 234 +++ ...ient_1_1_components_1_1_i_byond_client.png | Bin 0 -> 1111 bytes ...onents_1_1_i_chat_bots_client-members.html | 114 + ...1_1_components_1_1_i_chat_bots_client.html | 327 +++ ..._1_1_components_1_1_i_chat_bots_client.png | Bin 0 -> 1140 bytes ...ts_1_1_i_configuration_client-members.html | 114 + ...components_1_1_i_configuration_client.html | 338 +++ ..._components_1_1_i_configuration_client.png | Bin 0 -> 1190 bytes ...nts_1_1_i_dream_daemon_client-members.html | 114 + ..._components_1_1_i_dream_daemon_client.html | 294 +++ ...1_components_1_1_i_dream_daemon_client.png | Bin 0 -> 1209 bytes ...ents_1_1_i_dream_maker_client-members.html | 114 + ...1_components_1_1_i_dream_maker_client.html | 305 +++ ..._1_components_1_1_i_dream_maker_client.png | Bin 0 -> 1207 bytes ...ponents_1_1_i_instance_client-members.html | 118 ++ ..._1_1_components_1_1_i_instance_client.html | 376 ++++ ...t_1_1_components_1_1_i_instance_client.png | Bin 0 -> 1114 bytes ...ts_1_1_i_instance_user_client-members.html | 115 + ...components_1_1_i_instance_user_client.html | 357 ++++ ..._components_1_1_i_instance_user_client.png | Bin 0 -> 1184 bytes ..._components_1_1_i_jobs_client-members.html | 113 + ...ient_1_1_components_1_1_i_jobs_client.html | 275 +++ ...lient_1_1_components_1_1_i_jobs_client.png | Bin 0 -> 1058 bytes ...nents_1_1_i_repository_client-members.html | 113 + ..._1_components_1_1_i_repository_client.html | 275 +++ ...1_1_components_1_1_i_repository_client.png | Bin 0 -> 1179 bytes ...t_1_1_i_administration_client-members.html | 112 + ..._1_client_1_1_i_administration_client.html | 236 +++ ...1_1_client_1_1_i_administration_client.png | Bin 0 -> 935 bytes ...r_1_1_client_1_1_i_api_client-members.html | 128 ++ ..._1_server_1_1_client_1_1_i_api_client.html | 776 +++++++ ...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 | 110 + ...r_1_1_client_1_1_i_api_client_factory.html | 174 ++ ...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 | 111 + ...1_server_1_1_client_1_1_i_http_client.html | 207 ++ ..._1_server_1_1_client_1_1_i_http_client.png | Bin 0 -> 1082 bytes ...1_1_i_instance_manager_client-members.html | 115 + ..._client_1_1_i_instance_manager_client.html | 357 ++++ ...1_client_1_1_i_instance_manager_client.png | Bin 0 -> 1066 bytes ...1_client_1_1_i_request_logger-members.html | 111 + ...erver_1_1_client_1_1_i_request_logger.html | 202 ++ ..._1_client_1_1_i_server_client-members.html | 117 ++ ...server_1_1_client_1_1_i_server_client.html | 361 ++++ ..._server_1_1_client_1_1_i_server_client.png | Bin 0 -> 1068 bytes ...t_1_1_i_server_client_factory-members.html | 111 + ..._1_client_1_1_i_server_client_factory.html | 243 +++ ...1_1_client_1_1_i_server_client_factory.png | Bin 0 -> 934 bytes ...1_1_client_1_1_i_users_client-members.html | 114 + ..._server_1_1_client_1_1_i_users_client.html | 316 +++ ...1_server_1_1_client_1_1_i_users_client.png | Bin 0 -> 855 bytes ...d_1_1_i_byond_executable_lock-members.html | 113 + ...1_1_byond_1_1_i_byond_executable_lock.html | 242 +++ ..._1_1_byond_1_1_i_byond_executable_lock.png | Bin 0 -> 1702 bytes ...1_byond_1_1_i_byond_installer-members.html | 114 + ...nents_1_1_byond_1_1_i_byond_installer.html | 312 +++ ...onents_1_1_byond_1_1_i_byond_installer.png | Bin 0 -> 1789 bytes ...1_1_byond_1_1_i_byond_manager-members.html | 113 + ...ponents_1_1_byond_1_1_i_byond_manager.html | 275 +++ ...mponents_1_1_byond_1_1_i_byond_manager.png | Bin 0 -> 2278 bytes ...at_1_1_commands_1_1_i_command-members.html | 113 + ...s_1_1_chat_1_1_commands_1_1_i_command.html | 272 +++ ...ts_1_1_chat_1_1_commands_1_1_i_command.png | Bin 0 -> 3441 bytes ...ommands_1_1_i_command_factory-members.html | 110 + ...at_1_1_commands_1_1_i_command_factory.html | 156 ++ ...hat_1_1_commands_1_1_i_command_factory.png | Bin 0 -> 1360 bytes ...omponents_1_1_chat_1_1_i_chat-members.html | 118 ++ ...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 | 110 + ...omponents_1_1_chat_1_1_i_chat_factory.html | 181 ++ ...components_1_1_chat_1_1_i_chat_factory.png | Bin 0 -> 1195 bytes ..._1_1_i_custom_command_handler-members.html | 110 + ...1_1_chat_1_1_i_custom_command_handler.html | 188 ++ ..._1_1_chat_1_1_i_custom_command_handler.png | Bin 0 -> 1277 bytes ...t_1_1_i_json_tracking_context-members.html | 112 + ..._1_1_chat_1_1_i_json_tracking_context.html | 239 +++ ...s_1_1_chat_1_1_i_json_tracking_context.png | Bin 0 -> 1709 bytes ...1_chat_1_1_i_provider_factory-members.html | 110 + ...nents_1_1_chat_1_1_i_provider_factory.html | 161 ++ ...onents_1_1_chat_1_1_i_provider_factory.png | Bin 0 -> 1284 bytes ..._1_1_providers_1_1_i_provider-members.html | 116 ++ ...1_1_chat_1_1_providers_1_1_i_provider.html | 379 ++++ ..._1_1_chat_1_1_providers_1_1_i_provider.png | Bin 0 -> 3182 bytes ...er_1_1_i_compile_job_consumer-members.html | 110 + ...1_compiler_1_1_i_compile_job_consumer.html | 176 ++ ..._1_compiler_1_1_i_compile_job_consumer.png | Bin 0 -> 2302 bytes ..._1_compiler_1_1_i_dmb_factory-members.html | 114 + ...onents_1_1_compiler_1_1_i_dmb_factory.html | 305 +++ ...ponents_1_1_compiler_1_1_i_dmb_factory.png | Bin 0 -> 1251 bytes ..._1_compiler_1_1_i_dream_maker-members.html | 110 + ...onents_1_1_compiler_1_1_i_dream_maker.html | 207 ++ ...ponents_1_1_compiler_1_1_i_dream_maker.png | Bin 0 -> 1259 bytes ...components_1_1_i_dmb_provider-members.html | 114 + ...ost_1_1_components_1_1_i_dmb_provider.html | 278 +++ ...host_1_1_components_1_1_i_dmb_provider.png | Bin 0 -> 2278 bytes ...mponents_1_1_i_event_consumer-members.html | 110 + ...t_1_1_components_1_1_i_event_consumer.html | 187 ++ ...st_1_1_components_1_1_i_event_consumer.png | Bin 0 -> 3330 bytes ...1_1_components_1_1_i_instance-members.html | 118 ++ ..._1_host_1_1_components_1_1_i_instance.html | 412 ++++ ...1_1_host_1_1_components_1_1_i_instance.png | Bin 0 -> 1824 bytes ...onents_1_1_i_instance_factory-members.html | 110 + ...1_1_components_1_1_i_instance_factory.html | 164 ++ ..._1_1_components_1_1_i_instance_factory.png | Bin 0 -> 1530 bytes ...onents_1_1_i_instance_manager-members.html | 113 + ...1_1_components_1_1_i_instance_manager.html | 298 +++ ..._1_1_components_1_1_i_instance_manager.png | Bin 0 -> 1197 bytes ..._1_interop_1_1_i_comm_context-members.html | 110 + ...onents_1_1_interop_1_1_i_comm_context.html | 165 ++ ...ponents_1_1_interop_1_1_i_comm_context.png | Bin 0 -> 1534 bytes ..._1_interop_1_1_i_comm_handler-members.html | 110 + ...onents_1_1_interop_1_1_i_comm_handler.html | 174 ++ ...ponents_1_1_interop_1_1_i_comm_handler.png | Bin 0 -> 1280 bytes ...ry_1_1_i_credentials_provider-members.html | 110 + ...repository_1_1_i_credentials_provider.html | 174 ++ ..._repository_1_1_i_credentials_provider.png | Bin 0 -> 1402 bytes ...1_repository_1_1_i_repository-members.html | 125 ++ ...nents_1_1_repository_1_1_i_repository.html | 813 ++++++++ ...onents_1_1_repository_1_1_i_repository.png | Bin 0 -> 1535 bytes ...tory_1_1_i_repository_manager-members.html | 114 + ...1_repository_1_1_i_repository_manager.html | 322 +++ ..._1_repository_1_1_i_repository_manager.png | Bin 0 -> 1698 bytes ...tic_files_1_1_i_configuration-members.html | 117 ++ ..._1_1_static_files_1_1_i_configuration.html | 483 +++++ ...s_1_1_static_files_1_1_i_configuration.png | Bin 0 -> 3004 bytes ...g_1_1_i_network_prompt_reaper-members.html | 110 + ..._watchdog_1_1_i_network_prompt_reaper.html | 163 ++ ...1_watchdog_1_1_i_network_prompt_reaper.png | Bin 0 -> 2005 bytes ...g_1_1_i_reattach_info_handler-members.html | 111 + ..._watchdog_1_1_i_reattach_info_handler.html | 204 ++ ...1_watchdog_1_1_i_reattach_info_handler.png | Bin 0 -> 1338 bytes ...hdog_1_1_i_session_controller-members.html | 126 ++ ...1_1_watchdog_1_1_i_session_controller.html | 606 ++++++ ..._1_1_watchdog_1_1_i_session_controller.png | Bin 0 -> 3139 bytes ..._i_session_controller_factory-members.html | 112 + ...hdog_1_1_i_session_controller_factory.html | 280 +++ ...chdog_1_1_i_session_controller_factory.png | Bin 0 -> 1436 bytes ...s_1_1_watchdog_1_1_i_watchdog-members.html | 121 ++ ...omponents_1_1_watchdog_1_1_i_watchdog.html | 490 +++++ ...components_1_1_watchdog_1_1_i_watchdog.png | Bin 0 -> 2792 bytes ...tchdog_1_1_i_watchdog_factory-members.html | 110 + ...s_1_1_watchdog_1_1_i_watchdog_factory.html | 209 ++ ...ts_1_1_watchdog_1_1_i_watchdog_factory.png | Bin 0 -> 1282 bytes ...st_1_1_core_1_1_i_application-members.html | 113 + ...r_1_1_host_1_1_core_1_1_i_application.html | 250 +++ ...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 | 110 + ...1_1_host_1_1_core_1_1_i_async_delayer.html | 176 ++ ..._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 | 110 + ...1_1_core_1_1_i_d_b_connection_factory.html | 174 ++ ..._1_1_core_1_1_i_d_b_connection_factory.png | Bin 0 -> 1155 bytes ..._1_i_database_context_factory-members.html | 110 + ...1_core_1_1_i_database_context_factory.html | 163 ++ ..._1_core_1_1_i_database_context_factory.png | Bin 0 -> 1216 bytes ..._1_1_i_git_hub_client_factory-members.html | 111 + ...1_1_core_1_1_i_git_hub_client_factory.html | 186 ++ ..._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 | 113 + ...r_1_1_host_1_1_core_1_1_i_job_manager.html | 315 +++ ...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 | 111 + ...st_1_1_core_1_1_i_platform_identifier.html | 189 ++ ...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 | 117 ++ ...erver_1_1_host_1_1_core_1_1_i_process.html | 299 +++ ...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 | 111 + ..._1_1_host_1_1_core_1_1_i_process_base.html | 196 ++ ...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 | 111 + ..._host_1_1_core_1_1_i_process_executor.html | 232 +++ ...1_host_1_1_core_1_1_i_process_executor.png | Bin 0 -> 1013 bytes ..._1_core_1_1_i_restart_handler-members.html | 110 + ...1_host_1_1_core_1_1_i_restart_handler.html | 175 ++ ..._1_host_1_1_core_1_1_i_restart_handler.png | Bin 0 -> 1590 bytes ...t_1_1_core_1_1_i_restart_registration.html | 126 ++ ...st_1_1_core_1_1_i_restart_registration.png | Bin 0 -> 1417 bytes ...1_1_core_1_1_i_server_control-members.html | 113 + ..._1_host_1_1_core_1_1_i_server_control.html | 272 +++ ...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 | 110 + ..._1_1_host_1_1_core_1_1_i_setup_wizard.html | 166 ++ ...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 | 113 + ...server_1_1_host_1_1_i_o_1_1_i_console.html | 284 +++ ..._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 | 131 ++ ...er_1_1_host_1_1_i_o_1_1_i_i_o_manager.html | 1036 +++++++++ ...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 | 110 + ...host_1_1_i_o_1_1_i_post_write_handler.html | 161 ++ ..._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 | 110 + ..._1_host_1_1_i_o_1_1_i_symlink_factory.html | 184 ++ ...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 | 116 ++ ...1_1_i_o_1_1_i_synchronous_i_o_manager.html | 401 ++++ ..._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 | 111 + ...tion_1_1_server_1_1_host_1_1_i_server.html | 198 ++ ...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 | 110 + ..._server_1_1_host_1_1_i_server_factory.html | 176 ++ ...1_server_1_1_host_1_1_i_server_factory.png | Bin 0 -> 873 bytes ...models_1_1_i_database_context-members.html | 124 ++ ...ost_1_1_models_1_1_i_database_context.html | 565 +++++ ...host_1_1_models_1_1_i_database_context.png | Bin 0 -> 1314 bytes ..._models_1_1_i_database_seeder-members.html | 111 + ...host_1_1_models_1_1_i_database_seeder.html | 215 ++ ..._host_1_1_models_1_1_i_database_seeder.png | Bin 0 -> 1121 bytes ..._1_1_i_authentication_context-members.html | 113 + ...security_1_1_i_authentication_context.html | 250 +++ ..._security_1_1_i_authentication_context.png | Bin 0 -> 1544 bytes ...uthentication_context_factory-members.html | 111 + ..._1_1_i_authentication_context_factory.html | 222 ++ ...y_1_1_i_authentication_context_factory.png | Bin 0 -> 1320 bytes ...ecurity_1_1_i_claims_injector-members.html | 110 + ...st_1_1_security_1_1_i_claims_injector.html | 174 ++ ...ost_1_1_security_1_1_i_claims_injector.png | Bin 0 -> 1095 bytes ...rity_1_1_i_cryptography_suite-members.html | 113 + ...1_1_security_1_1_i_cryptography_suite.html | 276 +++ ..._1_1_security_1_1_i_cryptography_suite.png | Bin 0 -> 1236 bytes ...security_1_1_i_identity_cache-members.html | 111 + ...ost_1_1_security_1_1_i_identity_cache.html | 210 ++ ...host_1_1_security_1_1_i_identity_cache.png | Bin 0 -> 1046 bytes ...ecurity_1_1_i_system_identity-members.html | 113 + ...st_1_1_security_1_1_i_system_identity.html | 265 +++ ...ost_1_1_security_1_1_i_system_identity.png | Bin 0 -> 1545 bytes ...1_1_i_system_identity_factory-members.html | 111 + ...ecurity_1_1_i_system_identity_factory.html | 223 ++ ...security_1_1_i_system_identity_factory.png | Bin 0 -> 1792 bytes ..._security_1_1_i_token_factory-members.html | 111 + ...host_1_1_security_1_1_i_token_factory.html | 208 ++ ..._host_1_1_security_1_1_i_token_factory.png | Bin 0 -> 1081 bytes ...t_1_1_watchdog_1_1_i_watchdog-members.html | 110 + ..._1_1_host_1_1_watchdog_1_1_i_watchdog.html | 181 ++ ...r_1_1_host_1_1_watchdog_1_1_i_watchdog.png | Bin 0 -> 867 bytes ...tchdog_1_1_i_watchdog_factory-members.html | 110 + ...t_1_1_watchdog_1_1_i_watchdog_factory.html | 165 ++ ...st_1_1_watchdog_1_1_i_watchdog_factory.png | Bin 0 -> 1116 bytes jquery.js | 68 + namespace_tgstation.html | 108 + namespace_tgstation_1_1_server.html | 118 ++ namespace_tgstation_1_1_server_1_1_api.html | 126 ++ ...station_1_1_server_1_1_api_1_1_models.html | 398 ++++ ...erver_1_1_api_1_1_models_1_1_internal.html | 143 ++ ...1_server_1_1_api_1_1_models_1_1_tests.html | 112 + ...station_1_1_server_1_1_api_1_1_rights.html | 868 ++++++++ ...1_server_1_1_api_1_1_rights_1_1_tests.html | 113 + ...gstation_1_1_server_1_1_api_1_1_tests.html | 113 + ...space_tgstation_1_1_server_1_1_client.html | 197 ++ ..._1_1_server_1_1_client_1_1_components.html | 161 ++ ...r_1_1_client_1_1_components_1_1_tests.html | 112 + ...ation_1_1_server_1_1_client_1_1_tests.html | 114 + namespace_tgstation_1_1_server_1_1_host.html | 152 ++ ...on_1_1_server_1_1_host_1_1_components.html | 262 +++ ...ver_1_1_host_1_1_components_1_1_byond.html | 135 ++ ...st_1_1_components_1_1_byond_1_1_tests.html | 112 + ...rver_1_1_host_1_1_components_1_1_chat.html | 153 ++ ..._1_1_components_1_1_chat_1_1_commands.html | 139 ++ ...1_1_components_1_1_chat_1_1_providers.html | 130 ++ ...ents_1_1_chat_1_1_providers_1_1_tests.html | 112 + ..._1_1_host_1_1_components_1_1_compiler.html | 129 ++ ...r_1_1_host_1_1_components_1_1_interop.html | 137 ++ ..._1_host_1_1_components_1_1_repository.html | 125 ++ ..._host_1_1_components_1_1_static_files.html | 118 ++ ..._1_1_host_1_1_components_1_1_watchdog.html | 396 ++++ ...1_1_components_1_1_watchdog_1_1_tests.html | 112 + ...1_1_server_1_1_host_1_1_configuration.html | 220 ++ ...ation_1_1_server_1_1_host_1_1_console.html | 119 ++ ...server_1_1_host_1_1_console_1_1_tests.html | 112 + ...n_1_1_server_1_1_host_1_1_controllers.html | 155 ++ ...gstation_1_1_server_1_1_host_1_1_core.html | 192 ++ ..._1_server_1_1_host_1_1_core_1_1_tests.html | 129 ++ ...tgstation_1_1_server_1_1_host_1_1_i_o.html | 152 ++ ...1_1_server_1_1_host_1_1_i_o_1_1_tests.html | 116 ++ ...tation_1_1_server_1_1_host_1_1_models.html | 172 ++ ...er_1_1_host_1_1_models_1_1_migrations.html | 145 ++ ...tion_1_1_server_1_1_host_1_1_security.html | 165 ++ ...erver_1_1_host_1_1_security_1_1_tests.html | 113 + ...ation_1_1_server_1_1_host_1_1_service.html | 122 ++ ...server_1_1_host_1_1_service_1_1_tests.html | 113 + ...station_1_1_server_1_1_host_1_1_tests.html | 113 + ...tion_1_1_server_1_1_host_1_1_watchdog.html | 126 ++ ...erver_1_1_host_1_1_watchdog_1_1_tests.html | 115 + namespace_tgstation_1_1_server_1_1_tests.html | 124 ++ ...ion_1_1_server_1_1_tests_1_1_instance.html | 116 ++ namespacemembers.html | 170 ++ namespacemembers_enum.html | 170 ++ namespaces.html | 150 ++ 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 | 26 + search/all_0.js | 19 + search/all_1.html | 26 + search/all_1.js | 111 + search/all_10.html | 26 + search/all_10.js | 72 + search/all_11.html | 26 + search/all_11.js | 4 + search/all_12.html | 26 + search/all_12.js | 150 ++ search/all_13.html | 26 + search/all_13.js | 140 ++ search/all_14.html | 26 + search/all_14.js | 230 ++ search/all_15.html | 26 + search/all_15.js | 56 + search/all_16.html | 26 + search/all_16.js | 16 + search/all_17.html | 26 + search/all_17.js | 56 + search/all_18.html | 26 + search/all_18.js | 4 + search/all_19.html | 26 + search/all_19.js | 5 + search/all_2.html | 26 + search/all_2.js | 55 + search/all_3.html | 26 + search/all_3.js | 235 +++ search/all_4.html | 26 + search/all_4.js | 148 ++ search/all_5.html | 26 + search/all_5.js | 28 + search/all_6.html | 26 + search/all_6.js | 14 + search/all_7.html | 26 + search/all_7.js | 47 + search/all_8.html | 26 + search/all_8.js | 29 + search/all_9.html | 26 + search/all_9.js | 278 +++ search/all_a.html | 26 + search/all_a.js | 39 + search/all_b.html | 26 + search/all_b.js | 7 + search/all_c.html | 26 + search/all_c.js | 36 + search/all_d.html | 26 + search/all_d.js | 76 + search/all_e.html | 26 + search/all_e.js | 25 + search/all_f.html | 26 + search/all_f.js | 24 + search/classes_0.html | 26 + search/classes_0.js | 20 + search/classes_1.html | 26 + search/classes_1.js | 11 + search/classes_10.html | 26 + search/classes_10.js | 21 + search/classes_11.html | 26 + search/classes_11.js | 41 + search/classes_12.html | 26 + search/classes_12.js | 13 + search/classes_13.html | 26 + search/classes_13.js | 4 + search/classes_14.html | 26 + search/classes_14.js | 16 + search/classes_2.html | 26 + search/classes_2.js | 36 + search/classes_3.html | 26 + search/classes_3.js | 29 + search/classes_4.html | 26 + search/classes_4.js | 7 + search/classes_5.html | 26 + search/classes_5.js | 4 + search/classes_6.html | 26 + search/classes_6.js | 5 + search/classes_7.html | 26 + search/classes_7.js | 5 + search/classes_8.html | 26 + search/classes_8.js | 110 + search/classes_9.html | 26 + search/classes_9.js | 15 + search/classes_a.html | 26 + search/classes_a.js | 4 + search/classes_b.html | 26 + search/classes_b.js | 4 + search/classes_c.html | 26 + search/classes_c.js | 33 + search/classes_d.html | 26 + search/classes_d.js | 4 + search/classes_e.html | 26 + search/classes_e.js | 17 + search/classes_f.html | 26 + search/classes_f.js | 26 + search/close.png | Bin 0 -> 273 bytes search/enums_0.html | 26 + search/enums_0.js | 5 + search/enums_1.html | 26 + search/enums_1.js | 4 + search/enums_2.html | 26 + search/enums_2.js | 8 + search/enums_3.html | 26 + search/enums_3.js | 8 + search/enums_4.html | 26 + search/enums_4.js | 4 + search/enums_5.html | 26 + search/enums_5.js | 6 + search/enums_6.html | 26 + search/enums_6.js | 5 + search/enums_7.html | 26 + search/enums_7.js | 6 + search/enums_8.html | 26 + search/enums_8.js | 4 + search/enumvalues_0.html | 26 + search/enumvalues_0.js | 9 + search/enumvalues_1.html | 26 + search/enumvalues_1.js | 9 + search/enumvalues_10.html | 26 + search/enumvalues_10.js | 10 + search/enumvalues_2.html | 26 + search/enumvalues_2.js | 23 + search/enumvalues_3.html | 26 + search/enumvalues_3.js | 9 + search/enumvalues_4.html | 26 + search/enumvalues_4.js | 5 + search/enumvalues_5.html | 26 + search/enumvalues_5.js | 4 + search/enumvalues_6.html | 26 + search/enumvalues_6.js | 5 + search/enumvalues_7.html | 26 + search/enumvalues_7.js | 10 + search/enumvalues_8.html | 26 + search/enumvalues_8.js | 5 + search/enumvalues_9.html | 26 + search/enumvalues_9.js | 6 + search/enumvalues_a.html | 26 + search/enumvalues_a.js | 9 + search/enumvalues_b.html | 26 + search/enumvalues_b.js | 6 + search/enumvalues_c.html | 26 + search/enumvalues_c.js | 23 + search/enumvalues_d.html | 26 + search/enumvalues_d.js | 27 + search/enumvalues_e.html | 26 + search/enumvalues_e.js | 4 + search/enumvalues_f.html | 26 + search/enumvalues_f.js | 6 + search/files_0.html | 26 + search/files_0.js | 19 + search/files_1.html | 26 + search/files_1.js | 28 + search/files_10.html | 26 + search/files_10.js | 30 + search/files_11.html | 26 + search/files_11.js | 21 + search/files_12.html | 26 + search/files_12.js | 59 + search/files_13.html | 26 + search/files_13.js | 13 + search/files_14.html | 26 + search/files_14.js | 4 + search/files_15.html | 26 + search/files_15.js | 16 + search/files_2.html | 26 + search/files_2.js | 12 + search/files_3.html | 26 + search/files_3.js | 39 + search/files_4.html | 26 + search/files_4.js | 31 + search/files_5.html | 26 + search/files_5.js | 7 + search/files_6.html | 26 + search/files_6.js | 4 + search/files_7.html | 26 + search/files_7.js | 6 + search/files_8.html | 26 + search/files_8.js | 5 + search/files_9.html | 26 + search/files_9.js | 108 + search/files_a.html | 26 + search/files_a.js | 14 + search/files_b.html | 26 + search/files_b.js | 4 + search/files_c.html | 26 + search/files_c.js | 4 + search/files_d.html | 26 + search/files_d.js | 12 + search/files_e.html | 26 + search/files_e.js | 4 + search/files_f.html | 26 + search/files_f.js | 17 + search/functions_0.html | 26 + search/functions_0.js | 20 + search/functions_1.html | 26 + search/functions_1.js | 12 + search/functions_10.html | 26 + search/functions_10.js | 52 + search/functions_11.html | 26 + search/functions_11.js | 48 + search/functions_12.html | 26 + search/functions_12.js | 64 + search/functions_13.html | 26 + search/functions_13.js | 17 + search/functions_14.html | 26 + search/functions_14.js | 9 + search/functions_15.html | 26 + search/functions_15.js | 19 + search/functions_16.html | 26 + search/functions_16.js | 4 + search/functions_17.html | 26 + search/functions_17.js | 5 + search/functions_2.html | 26 + search/functions_2.js | 85 + search/functions_3.html | 26 + search/functions_3.js | 36 + search/functions_4.html | 26 + search/functions_4.js | 10 + search/functions_5.html | 26 + search/functions_5.js | 9 + search/functions_6.html | 26 + search/functions_6.js | 33 + search/functions_7.html | 26 + search/functions_7.js | 14 + search/functions_8.html | 26 + search/functions_8.js | 30 + search/functions_9.html | 26 + search/functions_9.js | 11 + search/functions_a.html | 26 + search/functions_a.js | 4 + search/functions_b.html | 26 + search/functions_b.js | 21 + search/functions_c.html | 26 + search/functions_c.js | 16 + search/functions_d.html | 26 + search/functions_d.js | 7 + search/functions_e.html | 26 + search/functions_e.js | 12 + search/functions_f.html | 26 + search/functions_f.js | 18 + search/mag_sel.png | Bin 0 -> 563 bytes search/namespaces_0.html | 26 + search/namespaces_0.js | 49 + search/nomatches.html | 12 + search/pages_0.html | 26 + search/pages_0.js | 4 + search/pages_1.html | 26 + search/pages_1.js | 4 + search/pages_2.html | 26 + search/pages_2.js | 4 + search/properties_0.html | 26 + search/properties_0.js | 34 + search/properties_1.html | 26 + search/properties_1.js | 13 + search/properties_10.html | 26 + search/properties_10.js | 24 + search/properties_11.html | 26 + search/properties_11.js | 17 + search/properties_12.html | 26 + search/properties_12.js | 14 + search/properties_13.html | 26 + search/properties_13.js | 8 + search/properties_14.html | 26 + search/properties_14.js | 8 + search/properties_2.html | 26 + search/properties_2.js | 46 + search/properties_3.html | 26 + search/properties_3.js | 27 + search/properties_4.html | 26 + search/properties_4.js | 7 + search/properties_5.html | 26 + search/properties_5.js | 4 + search/properties_6.html | 26 + search/properties_6.js | 9 + search/properties_7.html | 26 + search/properties_7.js | 8 + search/properties_8.html | 26 + search/properties_8.js | 28 + search/properties_9.html | 26 + search/properties_9.js | 6 + search/properties_a.html | 26 + search/properties_a.js | 11 + search/properties_b.html | 26 + search/properties_b.js | 13 + search/properties_c.html | 26 + search/properties_c.js | 9 + search/properties_d.html | 26 + search/properties_d.js | 9 + search/properties_e.html | 26 + search/properties_e.js | 23 + search/properties_f.html | 26 + search/properties_f.js | 22 + search/search.css | 271 +++ search/search.js | 791 +++++++ search/search_l.png | Bin 0 -> 604 bytes search/search_m.png | Bin 0 -> 158 bytes search/search_r.png | Bin 0 -> 612 bytes search/searchdata.js | 42 + search/variables_0.html | 26 + search/variables_0.js | 29 + search/variables_1.html | 26 + search/variables_1.js | 21 + search/variables_10.html | 26 + search/variables_10.js | 4 + search/variables_11.html | 26 + search/variables_11.js | 28 + search/variables_12.html | 26 + search/variables_12.js | 20 + search/variables_13.html | 26 + search/variables_13.js | 18 + search/variables_14.html | 26 + search/variables_14.js | 13 + search/variables_15.html | 26 + search/variables_15.js | 7 + search/variables_16.html | 26 + search/variables_16.js | 8 + search/variables_2.html | 26 + search/variables_2.js | 40 + search/variables_3.html | 26 + search/variables_3.js | 47 + search/variables_4.html | 26 + search/variables_4.js | 7 + search/variables_5.html | 26 + search/variables_5.js | 5 + search/variables_6.html | 26 + search/variables_6.js | 7 + search/variables_7.html | 26 + search/variables_7.js | 11 + search/variables_8.html | 26 + search/variables_8.js | 23 + search/variables_9.html | 26 + search/variables_9.js | 8 + search/variables_a.html | 26 + search/variables_a.js | 4 + search/variables_b.html | 26 + search/variables_b.js | 9 + search/variables_c.html | 26 + search/variables_c.js | 10 + search/variables_d.html | 26 + search/variables_d.js | 10 + search/variables_e.html | 26 + search/variables_e.js | 9 + search/variables_f.html | 26 + search/variables_f.js | 18 + splitbar.png | Bin 0 -> 314 bytes ...8_server_8_client_2_assembly_info_8cs.html | 105 + ...r_8_client_2_assembly_info_8cs_source.html | 104 + ...n_8_server_8_host_2_assembly_info_8cs.html | 105 + ...ver_8_host_2_assembly_info_8cs_source.html | 104 + ..._8_host_8_console_2_assembly_info_8cs.html | 105 + ..._8_console_2_assembly_info_8cs_source.html | 104 + ...vice_2_properties_2_assembly_info_8cs.html | 105 + ...properties_2_assembly_info_8cs_source.html | 104 + ...8_host_8_watchdog_2_assembly_info_8cs.html | 105 + ...8_watchdog_2_assembly_info_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 | 60 + ...ests_2_properties_2_assembly_info_8cs.html | 105 + ...properties_2_assembly_info_8cs_source.html | 104 + tgs.ico | Bin 0 -> 123198 bytes 2347 files changed, 300219 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 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 _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_8cs.html create mode 100644 _components_2_watchdog_2_watchdog_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_2_program_8cs.html create mode 100644 _console_2_program_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 _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 _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 _program_8cs.html create mode 100644 _program_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 _r_e_a_d_m_e_8md_source.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 _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_2_program_8cs.html create mode 100644 _service_2_program_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 _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_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_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_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_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_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_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_tests_2_components_2_watchdog_2_test_watchdog_8cs.html create mode 100644 _tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_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_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_2_test_watchdog_8cs.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_8_tests_2_test_watchdog_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_8cs.html create mode 100644 _watchdog_2_watchdog_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_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 arrowdown.png create mode 100644 arrowright.png 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_exception.html create mode 100644 class_exception.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_event_log.html create mode 100644 class_i_event_log.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_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_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_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_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_watchdog.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.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_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_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_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_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_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_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_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_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_02f69155ced6ccca99a24744a5273903.html create mode 100644 dir_08963d262fa9e27215dce7b7c6e97f1b.html create mode 100644 dir_0c9add60ab05c04ed8367ecaedf67c01.html create mode 100644 dir_0de875c2ee7edd4009e892c5045f7b3a.html create mode 100644 dir_0e792d76844bf2d7c79795a56a50ebec.html create mode 100644 dir_0f5073360b9ba6d1522457c65eebe36a.html create mode 100644 dir_103b33cf1ab7043de6f87dfa61afa23f.html create mode 100644 dir_1302441b003a340c6a16c9bc1b51c94e.html create mode 100644 dir_13bee0ed20ecc83b9bcd4b869b726d42.html create mode 100644 dir_177c182c6d1f29bec543c3fdad3072d5.html create mode 100644 dir_18a5e30c14613227f95d12bd9fddc614.html create mode 100644 dir_1cebbc1bce26b60bfb2ee26c80f86b02.html create mode 100644 dir_2133157f8312226ef9ea4ce42a802cf8.html create mode 100644 dir_298f2a364723f4f4cea115538f944a94.html create mode 100644 dir_2ea2465064f3ff030c6dd6700a328d91.html create mode 100644 dir_34761767c1c3cd212f9d2f80ea0828a8.html create mode 100644 dir_383ca23c40357ede4cca827b4a365c76.html create mode 100644 dir_38cec1532eaed7aa1de0b599a76e3e80.html create mode 100644 dir_40138fd4849573e743490d583f6d06d6.html create mode 100644 dir_4122b363a9d577bed19bef337e757ff3.html create mode 100644 dir_446bdfc1cd19b69c11765b5665ebfd45.html create mode 100644 dir_4ddbd20a555bd1f3bf9569744c8989cc.html create mode 100644 dir_53aae571c66a052729f8e64ccc397130.html create mode 100644 dir_53c056aa6a96f034cca75f793964be6e.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_6c8d8f20501e8e412458f542d0998195.html create mode 100644 dir_6db5af7fcfa17a34c7abf23e195af4db.html create mode 100644 dir_71f5cbd840fdd1dea9f035c7b1a066ee.html create mode 100644 dir_74017a19412e2f90cc6ad11fcac82495.html create mode 100644 dir_7916dda968fadc8673161597975e4c5d.html create mode 100644 dir_7a3fd032a1362a6005a1fc9227a8dd86.html create mode 100644 dir_7a9487ad1984d08627fcf919e6f3d801.html create mode 100644 dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html create mode 100644 dir_7ae0efc0613c36c848fa310214e0aee3.html create mode 100644 dir_7cd79c49f3850abc2141fa4adfdd1950.html create mode 100644 dir_83a6f600c846cd444f33e44bb9b4f9cb.html create mode 100644 dir_860acef72838dce8d3d54c8f98bc464b.html create mode 100644 dir_87a4f2035ed18e30422f4b60aebc4381.html create mode 100644 dir_900257602d294c4a4799e88420919068.html create mode 100644 dir_90400719279795a0c5ea912516a4c874.html create mode 100644 dir_91e2bbee1291fcb0db7e0417b617d01e.html create mode 100644 dir_9826fb2d31585a830723e6d7089b5d0e.html create mode 100644 dir_a01d946a2e1b048dc542232ffcdcf572.html create mode 100644 dir_a24b8c5f308a77f73e7a9e43c0f243d1.html create mode 100644 dir_a44a562b5a12ef1c8495ac1a63e915ea.html create mode 100644 dir_a536e49cdf631f66733cf2c9791144ce.html create mode 100644 dir_a99ad55e4d1fa76955df2299f3783cf0.html create mode 100644 dir_b0d0d898ef448ca0a6a170a2896fa60e.html create mode 100644 dir_b2c89c850c962495793d09ea3a2ee385.html create mode 100644 dir_b524b00ec2259c3c83b44909fd47f6e3.html create mode 100644 dir_b6324197f7ac56e30d6189c3a45eec56.html create mode 100644 dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html create mode 100644 dir_bb25b36c82def1362ea245058c866cdc.html create mode 100644 dir_be6161819238d55fa660c07ade960e53.html create mode 100644 dir_c2c4d4ee47e55233c6ea5db8b96422c6.html create mode 100644 dir_c5451d9d233744a5b09a29938f0cda9a.html create mode 100644 dir_c648ff9d1a57dd8752f4ab2a7c68712c.html create mode 100644 dir_c65d377d3c73fb4a07b3637f9c0caf4d.html create mode 100644 dir_c9d0608eee53bfffcc33d03463bbe2db.html create mode 100644 dir_d45f494620bc0048ee4a31fa4f7391e1.html create mode 100644 dir_d8869fc9da5c696ed284d5c470b7210f.html create mode 100644 dir_d88de13ae4b64d4d0766b0c06f1a9edf.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_e928c7e494884ad322b5f6005c2954e1.html create mode 100644 dir_e9975c2f0de13509bd9fb4e31ae732ab.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_fb12273b841438c2f2c9b5bc5398c636.html create mode 100644 dir_fcc41a8faa41492aba200a49fc7d0aed.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_0x7e.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_0x7e.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_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 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 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/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_client_2_assembly_info_8cs.html create mode 100644 src_2_tgstation_8_server_8_client_2_assembly_info_8cs_source.html create mode 100644 src_2_tgstation_8_server_8_host_2_assembly_info_8cs.html create mode 100644 src_2_tgstation_8_server_8_host_2_assembly_info_8cs_source.html create mode 100644 src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html create mode 100644 src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html create mode 100644 src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html create mode 100644 src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html create mode 100644 src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html create mode 100644 src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_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 tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs.html create mode 100644 tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs_source.html create mode 100644 tgs.ico 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..db36b83d55 --- /dev/null +++ b/20180906135553___m_s_initial_create_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..413dff62ab --- /dev/null +++ b/20180906135553___m_s_initial_create_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Models.Migrations
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..9b6a15a8b8 --- /dev/null +++ b/20180906135553___m_s_initial_create_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..fe7477c746 --- /dev/null +++ b/20180906135553___m_s_initial_create_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Models.Migrations
6 {
10  public partial class MSInitialCreate : Migration
11  {
16  protected override void Up(MigrationBuilder migrationBuilder)
17  {
18  migrationBuilder.CreateTable(
19  name: "Users",
20  columns: table => new
21  {
22  Id = table.Column<long>(nullable: false)
23  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
24  Enabled = table.Column<bool>(nullable: false),
25  CreatedAt = table.Column<DateTimeOffset>(nullable: false),
26  SystemIdentifier = table.Column<string>(nullable: true),
27  Name = table.Column<string>(nullable: false),
28  AdministrationRights = table.Column<decimal>(nullable: false),
29  InstanceManagerRights = table.Column<decimal>(nullable: false),
30  PasswordHash = table.Column<string>(nullable: true),
31  CreatedById = table.Column<long>(nullable: true),
32  CanonicalName = table.Column<string>(nullable: false),
33  LastPasswordUpdate = table.Column<DateTimeOffset>(nullable: true)
34  },
35  constraints: table =>
36  {
37  table.PrimaryKey("PK_Users", x => x.Id);
38  table.ForeignKey(
39  name: "FK_Users_Users_CreatedById",
40  column: x => x.CreatedById,
41  principalTable: "Users",
42  principalColumn: "Id",
43  onDelete: ReferentialAction.Restrict);
44  });
45 
46  migrationBuilder.CreateTable(
47  name: "ChatChannels",
48  columns: table => new
49  {
50  IrcChannel = table.Column<string>(nullable: true),
51  DiscordChannelId = table.Column<decimal>(nullable: true),
52  IsAdminChannel = table.Column<bool>(nullable: false),
53  IsWatchdogChannel = table.Column<bool>(nullable: false),
54  IsUpdatesChannel = table.Column<bool>(nullable: false),
55  Tag = table.Column<string>(nullable: true),
56  Id = table.Column<long>(nullable: false)
57  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
58  ChatSettingsId = table.Column<long>(nullable: false)
59  },
60  constraints: table =>
61  {
62  table.PrimaryKey("PK_ChatChannels", x => x.Id);
63  });
64 
65  migrationBuilder.CreateTable(
66  name: "ReattachInformations",
67  columns: table => new
68  {
69  ChatCommandsJson = table.Column<string>(nullable: false),
70  ChatChannelsJson = table.Column<string>(nullable: false),
71  ServerCommandsJson = table.Column<string>(nullable: false),
72  AccessIdentifier = table.Column<string>(nullable: false),
73  ProcessId = table.Column<int>(nullable: false),
74  IsPrimary = table.Column<bool>(nullable: false),
75  Port = table.Column<int>(nullable: false),
76  RebootState = table.Column<int>(nullable: false),
77  Id = table.Column<long>(nullable: false)
78  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
79  CompileJobId = table.Column<long>(nullable: true)
80  },
81  constraints: table =>
82  {
83  table.PrimaryKey("PK_ReattachInformations", x => x.Id);
84  });
85 
86  migrationBuilder.CreateTable(
87  name: "WatchdogReattachInformations",
88  columns: table => new
89  {
90  AlphaIsActive = table.Column<bool>(nullable: false),
91  Id = table.Column<long>(nullable: false)
92  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
93  AlphaId = table.Column<long>(nullable: true),
94  BravoId = table.Column<long>(nullable: true)
95  },
96  constraints: table =>
97  {
98  table.PrimaryKey("PK_WatchdogReattachInformations", x => x.Id);
99  table.ForeignKey(
100  name: "FK_WatchdogReattachInformations_ReattachInformations_AlphaId",
101  column: x => x.AlphaId,
102  principalTable: "ReattachInformations",
103  principalColumn: "Id",
104  onDelete: ReferentialAction.Restrict);
105  table.ForeignKey(
106  name: "FK_WatchdogReattachInformations_ReattachInformations_BravoId",
107  column: x => x.BravoId,
108  principalTable: "ReattachInformations",
109  principalColumn: "Id",
110  onDelete: ReferentialAction.Restrict);
111  });
112 
113  migrationBuilder.CreateTable(
114  name: "Instances",
115  columns: table => new
116  {
117  Id = table.Column<long>(nullable: false)
118  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
119  Name = table.Column<string>(nullable: false),
120  Path = table.Column<string>(nullable: false),
121  Online = table.Column<bool>(nullable: false),
122  ConfigurationType = table.Column<int>(nullable: false),
123  AutoUpdateInterval = table.Column<long>(nullable: false),
124  WatchdogReattachInformationId = table.Column<long>(nullable: true)
125  },
126  constraints: table =>
127  {
128  table.PrimaryKey("PK_Instances", x => x.Id);
129  table.ForeignKey(
130  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
131  column: x => x.WatchdogReattachInformationId,
132  principalTable: "WatchdogReattachInformations",
133  principalColumn: "Id",
134  onDelete: ReferentialAction.Restrict);
135  });
136 
137  migrationBuilder.CreateTable(
138  name: "ChatBots",
139  columns: table => new
140  {
141  Id = table.Column<long>(nullable: false)
142  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
143  Name = table.Column<string>(nullable: false),
144  Enabled = table.Column<bool>(nullable: true),
145  Provider = table.Column<int>(nullable: true),
146  ConnectionString = table.Column<string>(nullable: false),
147  InstanceId = table.Column<long>(nullable: false)
148  },
149  constraints: table =>
150  {
151  table.PrimaryKey("PK_ChatBots", x => x.Id);
152  table.ForeignKey(
153  name: "FK_ChatBots_Instances_InstanceId",
154  column: x => x.InstanceId,
155  principalTable: "Instances",
156  principalColumn: "Id",
157  onDelete: ReferentialAction.Cascade);
158  });
159 
160  migrationBuilder.CreateTable(
161  name: "DreamDaemonSettings",
162  columns: table => new
163  {
164  AllowWebClient = table.Column<bool>(nullable: false),
165  SecurityLevel = table.Column<int>(nullable: false),
166  PrimaryPort = table.Column<int>(nullable: false),
167  SecondaryPort = table.Column<int>(nullable: false),
168  StartupTimeout = table.Column<long>(nullable: false),
169  AutoStart = table.Column<bool>(nullable: false),
170  SoftRestart = table.Column<bool>(nullable: false),
171  SoftShutdown = table.Column<bool>(nullable: false),
172  Id = table.Column<long>(nullable: false)
173  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
174  ProcessId = table.Column<int>(nullable: true),
175  AccessToken = table.Column<string>(nullable: true),
176  InstanceId = table.Column<long>(nullable: false)
177  },
178  constraints: table =>
179  {
180  table.PrimaryKey("PK_DreamDaemonSettings", x => x.Id);
181  table.ForeignKey(
182  name: "FK_DreamDaemonSettings_Instances_InstanceId",
183  column: x => x.InstanceId,
184  principalTable: "Instances",
185  principalColumn: "Id",
186  onDelete: ReferentialAction.Cascade);
187  });
188 
189  migrationBuilder.CreateTable(
190  name: "DreamMakerSettings",
191  columns: table => new
192  {
193  ProjectName = table.Column<string>(nullable: true),
194  ApiValidationPort = table.Column<int>(nullable: false),
195  Id = table.Column<long>(nullable: false)
196  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
197  InstanceId = table.Column<long>(nullable: false)
198  },
199  constraints: table =>
200  {
201  table.PrimaryKey("PK_DreamMakerSettings", x => x.Id);
202  table.ForeignKey(
203  name: "FK_DreamMakerSettings_Instances_InstanceId",
204  column: x => x.InstanceId,
205  principalTable: "Instances",
206  principalColumn: "Id",
207  onDelete: ReferentialAction.Cascade);
208  });
209 
210  migrationBuilder.CreateTable(
211  name: "InstanceUsers",
212  columns: table => new
213  {
214  UserId = table.Column<long>(nullable: false),
215  InstanceUserRights = table.Column<decimal>(nullable: false),
216  ByondRights = table.Column<decimal>(nullable: false),
217  DreamDaemonRights = table.Column<decimal>(nullable: false),
218  DreamMakerRights = table.Column<decimal>(nullable: false),
219  RepositoryRights = table.Column<decimal>(nullable: false),
220  ChatBotRights = table.Column<decimal>(nullable: false),
221  ConfigurationRights = table.Column<decimal>(nullable: false),
222  Id = table.Column<long>(nullable: false)
223  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
224  InstanceId = table.Column<long>(nullable: false)
225  },
226  constraints: table =>
227  {
228  table.PrimaryKey("PK_InstanceUsers", x => x.Id);
229  table.ForeignKey(
230  name: "FK_InstanceUsers_Instances_InstanceId",
231  column: x => x.InstanceId,
232  principalTable: "Instances",
233  principalColumn: "Id",
234  onDelete: ReferentialAction.Cascade);
235  table.ForeignKey(
236  name: "FK_InstanceUsers_Users_UserId",
237  column: x => x.UserId,
238  principalTable: "Users",
239  principalColumn: "Id",
240  onDelete: ReferentialAction.Cascade);
241  });
242 
243  migrationBuilder.CreateTable(
244  name: "Jobs",
245  columns: table => new
246  {
247  Id = table.Column<long>(nullable: false)
248  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
249  Description = table.Column<string>(nullable: false),
250  ExceptionDetails = table.Column<string>(nullable: true),
251  StartedAt = table.Column<DateTimeOffset>(nullable: false),
252  StoppedAt = table.Column<DateTimeOffset>(nullable: true),
253  Cancelled = table.Column<bool>(nullable: false),
254  CancelRightsType = table.Column<decimal>(nullable: true),
255  CancelRight = table.Column<decimal>(nullable: true),
256  StartedById = table.Column<long>(nullable: false),
257  CancelledById = table.Column<long>(nullable: true),
258  InstanceId = table.Column<long>(nullable: false)
259  },
260  constraints: table =>
261  {
262  table.PrimaryKey("PK_Jobs", x => x.Id);
263  table.ForeignKey(
264  name: "FK_Jobs_Users_CancelledById",
265  column: x => x.CancelledById,
266  principalTable: "Users",
267  principalColumn: "Id",
268  onDelete: ReferentialAction.Restrict);
269  table.ForeignKey(
270  name: "FK_Jobs_Instances_InstanceId",
271  column: x => x.InstanceId,
272  principalTable: "Instances",
273  principalColumn: "Id",
274  onDelete: ReferentialAction.Cascade);
275  table.ForeignKey(
276  name: "FK_Jobs_Users_StartedById",
277  column: x => x.StartedById,
278  principalTable: "Users",
279  principalColumn: "Id",
280  onDelete: ReferentialAction.Cascade);
281  });
282 
283  migrationBuilder.CreateTable(
284  name: "RepositorySettings",
285  columns: table => new
286  {
287  CommitterName = table.Column<string>(nullable: false),
288  CommitterEmail = table.Column<string>(nullable: false),
289  AccessUser = table.Column<string>(nullable: true),
290  AccessToken = table.Column<string>(nullable: true),
291  PushTestMergeCommits = table.Column<bool>(nullable: false),
292  ShowTestMergeCommitters = table.Column<bool>(nullable: false),
293  AutoUpdatesKeepTestMerges = table.Column<bool>(nullable: false),
294  AutoUpdatesSynchronize = table.Column<bool>(nullable: false),
295  Id = table.Column<long>(nullable: false)
296  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
297  InstanceId = table.Column<long>(nullable: false)
298  },
299  constraints: table =>
300  {
301  table.PrimaryKey("PK_RepositorySettings", x => x.Id);
302  table.ForeignKey(
303  name: "FK_RepositorySettings_Instances_InstanceId",
304  column: x => x.InstanceId,
305  principalTable: "Instances",
306  principalColumn: "Id",
307  onDelete: ReferentialAction.Cascade);
308  });
309 
310  migrationBuilder.CreateTable(
311  name: "RevisionInformations",
312  columns: table => new
313  {
314  CommitSha = table.Column<string>(maxLength: 40, nullable: false),
315  OriginCommitSha = table.Column<string>(maxLength: 40, nullable: false),
316  Id = table.Column<long>(nullable: false)
317  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
318  InstanceId = table.Column<long>(nullable: false)
319  },
320  constraints: table =>
321  {
322  table.PrimaryKey("PK_RevisionInformations", x => x.Id);
323  table.ForeignKey(
324  name: "FK_RevisionInformations_Instances_InstanceId",
325  column: x => x.InstanceId,
326  principalTable: "Instances",
327  principalColumn: "Id",
328  onDelete: ReferentialAction.Cascade);
329  });
330 
331  migrationBuilder.CreateTable(
332  name: "CompileJobs",
333  columns: table => new
334  {
335  Id = table.Column<long>(nullable: false)
336  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
337  DmeName = table.Column<string>(nullable: true),
338  Output = table.Column<string>(nullable: true),
339  DirectoryName = table.Column<Guid>(nullable: true),
340  JobId = table.Column<long>(nullable: true),
341  RevisionInformationId = table.Column<long>(nullable: false),
342  ByondVersion = table.Column<string>(nullable: false)
343  },
344  constraints: table =>
345  {
346  table.PrimaryKey("PK_CompileJobs", x => x.Id);
347  table.ForeignKey(
348  name: "FK_CompileJobs_Jobs_JobId",
349  column: x => x.JobId,
350  principalTable: "Jobs",
351  principalColumn: "Id",
352  onDelete: ReferentialAction.Restrict);
353  table.ForeignKey(
354  name: "FK_CompileJobs_RevisionInformations_RevisionInformationId",
355  column: x => x.RevisionInformationId,
356  principalTable: "RevisionInformations",
357  principalColumn: "Id",
358  onDelete: ReferentialAction.Cascade);
359  });
360 
361  migrationBuilder.CreateTable(
362  name: "TestMerges",
363  columns: table => new
364  {
365  Number = table.Column<int>(nullable: false),
366  PullRequestRevision = table.Column<string>(nullable: false),
367  Comment = table.Column<string>(nullable: true),
368  TitleAtMerge = table.Column<string>(nullable: false),
369  BodyAtMerge = table.Column<string>(nullable: false),
370  Url = table.Column<string>(nullable: false),
371  Author = table.Column<string>(nullable: false),
372  Id = table.Column<long>(nullable: false)
373  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
374  MergedAt = table.Column<DateTimeOffset>(nullable: false),
375  MergedById = table.Column<long>(nullable: false),
376  PrimaryRevisionInformationId = table.Column<long>(nullable: true)
377  },
378  constraints: table =>
379  {
380  table.PrimaryKey("PK_TestMerges", x => x.Id);
381  table.ForeignKey(
382  name: "FK_TestMerges_Users_MergedById",
383  column: x => x.MergedById,
384  principalTable: "Users",
385  principalColumn: "Id",
386  onDelete: ReferentialAction.Restrict);
387  table.ForeignKey(
388  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
389  column: x => x.PrimaryRevisionInformationId,
390  principalTable: "RevisionInformations",
391  principalColumn: "Id",
392  onDelete: ReferentialAction.SetNull);
393  });
394 
395  migrationBuilder.CreateTable(
396  name: "RevInfoTestMerges",
397  columns: table => new
398  {
399  Id = table.Column<long>(nullable: false)
400  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
401  TestMergeId = table.Column<long>(nullable: false),
402  RevisionInformationId = table.Column<long>(nullable: false)
403  },
404  constraints: table =>
405  {
406  table.PrimaryKey("PK_RevInfoTestMerges", x => x.Id);
407  table.ForeignKey(
408  name: "FK_RevInfoTestMerges_RevisionInformations_RevisionInformationId",
409  column: x => x.RevisionInformationId,
410  principalTable: "RevisionInformations",
411  principalColumn: "Id",
412  onDelete: ReferentialAction.Cascade);
413  table.ForeignKey(
414  name: "FK_RevInfoTestMerges_TestMerges_TestMergeId",
415  column: x => x.TestMergeId,
416  principalTable: "TestMerges",
417  principalColumn: "Id",
418  onDelete: ReferentialAction.Cascade);
419  });
420 
421  migrationBuilder.CreateIndex(
422  name: "IX_ChatBots_InstanceId",
423  table: "ChatBots",
424  column: "InstanceId");
425 
426  migrationBuilder.CreateIndex(
427  name: "IX_ChatBots_Name",
428  table: "ChatBots",
429  column: "Name",
430  unique: true);
431 
432  migrationBuilder.CreateIndex(
433  name: "IX_ChatChannels_ChatSettingsId_DiscordChannelId",
434  table: "ChatChannels",
435  columns: new[] { "ChatSettingsId", "DiscordChannelId" },
436  unique: true,
437  filter: "[DiscordChannelId] IS NOT NULL");
438 
439  migrationBuilder.CreateIndex(
440  name: "IX_ChatChannels_ChatSettingsId_IrcChannel",
441  table: "ChatChannels",
442  columns: new[] { "ChatSettingsId", "IrcChannel" },
443  unique: true,
444  filter: "[IrcChannel] IS NOT NULL");
445 
446  migrationBuilder.CreateIndex(
447  name: "IX_CompileJobs_DirectoryName",
448  table: "CompileJobs",
449  column: "DirectoryName");
450 
451  migrationBuilder.CreateIndex(
452  name: "IX_CompileJobs_JobId",
453  table: "CompileJobs",
454  column: "JobId");
455 
456  migrationBuilder.CreateIndex(
457  name: "IX_CompileJobs_RevisionInformationId",
458  table: "CompileJobs",
459  column: "RevisionInformationId");
460 
461  migrationBuilder.CreateIndex(
462  name: "IX_DreamDaemonSettings_InstanceId",
463  table: "DreamDaemonSettings",
464  column: "InstanceId",
465  unique: true);
466 
467  migrationBuilder.CreateIndex(
468  name: "IX_DreamMakerSettings_InstanceId",
469  table: "DreamMakerSettings",
470  column: "InstanceId",
471  unique: true);
472 
473  migrationBuilder.CreateIndex(
474  name: "IX_Instances_Path",
475  table: "Instances",
476  column: "Path",
477  unique: true);
478 
479  migrationBuilder.CreateIndex(
480  name: "IX_Instances_WatchdogReattachInformationId",
481  table: "Instances",
482  column: "WatchdogReattachInformationId");
483 
484  migrationBuilder.CreateIndex(
485  name: "IX_InstanceUsers_InstanceId",
486  table: "InstanceUsers",
487  column: "InstanceId");
488 
489  migrationBuilder.CreateIndex(
490  name: "IX_InstanceUsers_UserId_InstanceId",
491  table: "InstanceUsers",
492  columns: new[] { "UserId", "InstanceId" },
493  unique: true);
494 
495  migrationBuilder.CreateIndex(
496  name: "IX_Jobs_CancelledById",
497  table: "Jobs",
498  column: "CancelledById");
499 
500  migrationBuilder.CreateIndex(
501  name: "IX_Jobs_InstanceId",
502  table: "Jobs",
503  column: "InstanceId");
504 
505  migrationBuilder.CreateIndex(
506  name: "IX_Jobs_StartedById",
507  table: "Jobs",
508  column: "StartedById");
509 
510  migrationBuilder.CreateIndex(
511  name: "IX_ReattachInformations_CompileJobId",
512  table: "ReattachInformations",
513  column: "CompileJobId");
514 
515  migrationBuilder.CreateIndex(
516  name: "IX_RepositorySettings_InstanceId",
517  table: "RepositorySettings",
518  column: "InstanceId",
519  unique: true);
520 
521  migrationBuilder.CreateIndex(
522  name: "IX_RevInfoTestMerges_RevisionInformationId",
523  table: "RevInfoTestMerges",
524  column: "RevisionInformationId");
525 
526  migrationBuilder.CreateIndex(
527  name: "IX_RevInfoTestMerges_TestMergeId",
528  table: "RevInfoTestMerges",
529  column: "TestMergeId");
530 
531  migrationBuilder.CreateIndex(
532  name: "IX_RevisionInformations_CommitSha",
533  table: "RevisionInformations",
534  column: "CommitSha",
535  unique: true);
536 
537  migrationBuilder.CreateIndex(
538  name: "IX_RevisionInformations_InstanceId",
539  table: "RevisionInformations",
540  column: "InstanceId");
541 
542  migrationBuilder.CreateIndex(
543  name: "IX_TestMerges_MergedById",
544  table: "TestMerges",
545  column: "MergedById");
546 
547  migrationBuilder.CreateIndex(
548  name: "IX_TestMerges_PrimaryRevisionInformationId",
549  table: "TestMerges",
550  column: "PrimaryRevisionInformationId",
551  unique: true,
552  filter: "[PrimaryRevisionInformationId] IS NOT NULL");
553 
554  migrationBuilder.CreateIndex(
555  name: "IX_Users_CanonicalName",
556  table: "Users",
557  column: "CanonicalName",
558  unique: true);
559 
560  migrationBuilder.CreateIndex(
561  name: "IX_Users_CreatedById",
562  table: "Users",
563  column: "CreatedById");
564 
565  migrationBuilder.CreateIndex(
566  name: "IX_WatchdogReattachInformations_AlphaId",
567  table: "WatchdogReattachInformations",
568  column: "AlphaId");
569 
570  migrationBuilder.CreateIndex(
571  name: "IX_WatchdogReattachInformations_BravoId",
572  table: "WatchdogReattachInformations",
573  column: "BravoId");
574 
575  migrationBuilder.AddForeignKey(
576  name: "FK_ChatChannels_ChatBots_ChatSettingsId",
577  table: "ChatChannels",
578  column: "ChatSettingsId",
579  principalTable: "ChatBots",
580  principalColumn: "Id",
581  onDelete: ReferentialAction.Cascade);
582 
583  migrationBuilder.AddForeignKey(
584  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
585  table: "ReattachInformations",
586  column: "CompileJobId",
587  principalTable: "CompileJobs",
588  principalColumn: "Id",
589  onDelete: ReferentialAction.Restrict);
590  }
591 
596  protected override void Down(MigrationBuilder migrationBuilder)
597  {
598  migrationBuilder.DropForeignKey(
599  name: "FK_Jobs_Instances_InstanceId",
600  table: "Jobs");
601 
602  migrationBuilder.DropForeignKey(
603  name: "FK_RevisionInformations_Instances_InstanceId",
604  table: "RevisionInformations");
605 
606  migrationBuilder.DropTable(
607  name: "ChatChannels");
608 
609  migrationBuilder.DropTable(
610  name: "DreamDaemonSettings");
611 
612  migrationBuilder.DropTable(
613  name: "DreamMakerSettings");
614 
615  migrationBuilder.DropTable(
616  name: "InstanceUsers");
617 
618  migrationBuilder.DropTable(
619  name: "RepositorySettings");
620 
621  migrationBuilder.DropTable(
622  name: "RevInfoTestMerges");
623 
624  migrationBuilder.DropTable(
625  name: "ChatBots");
626 
627  migrationBuilder.DropTable(
628  name: "TestMerges");
629 
630  migrationBuilder.DropTable(
631  name: "Instances");
632 
633  migrationBuilder.DropTable(
634  name: "WatchdogReattachInformations");
635 
636  migrationBuilder.DropTable(
637  name: "ReattachInformations");
638 
639  migrationBuilder.DropTable(
640  name: "CompileJobs");
641 
642  migrationBuilder.DropTable(
643  name: "Jobs");
644 
645  migrationBuilder.DropTable(
646  name: "RevisionInformations");
647 
648  migrationBuilder.DropTable(
649  name: "Users");
650  }
651  }
652 }
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..647859b138 --- /dev/null +++ b/20180906143029___m_y_initial_create_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6432c06cda --- /dev/null +++ b/20180906143029___m_y_initial_create_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models.Migrations
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..570d9affe4 --- /dev/null +++ b/20180906143029___m_y_initial_create_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..4d893365cd --- /dev/null +++ b/20180906143029___m_y_initial_create_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Models.Migrations
6 {
10  public partial class MYInitialCreate : Migration
11  {
16  protected override void Up(MigrationBuilder migrationBuilder)
17  {
18  migrationBuilder.CreateTable(
19  name: "Users",
20  columns: table => new
21  {
22  Id = table.Column<long>(nullable: false)
23  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
24  Enabled = table.Column<bool>(nullable: false),
25  CreatedAt = table.Column<DateTimeOffset>(nullable: false),
26  SystemIdentifier = table.Column<string>(nullable: true),
27  Name = table.Column<string>(nullable: false),
28  AdministrationRights = table.Column<ulong>(nullable: false),
29  InstanceManagerRights = table.Column<ulong>(nullable: false),
30  PasswordHash = table.Column<string>(nullable: true),
31  CreatedById = table.Column<long>(nullable: true),
32  CanonicalName = table.Column<string>(nullable: false),
33  LastPasswordUpdate = table.Column<DateTimeOffset>(nullable: true)
34  },
35  constraints: table =>
36  {
37  table.PrimaryKey("PK_Users", x => x.Id);
38  table.ForeignKey(
39  name: "FK_Users_Users_CreatedById",
40  column: x => x.CreatedById,
41  principalTable: "Users",
42  principalColumn: "Id",
43  onDelete: ReferentialAction.Restrict);
44  });
45 
46  migrationBuilder.CreateTable(
47  name: "ChatChannels",
48  columns: table => new
49  {
50  IrcChannel = table.Column<string>(nullable: true),
51  DiscordChannelId = table.Column<ulong>(nullable: true),
52  IsAdminChannel = table.Column<bool>(nullable: false),
53  IsWatchdogChannel = table.Column<bool>(nullable: false),
54  IsUpdatesChannel = table.Column<bool>(nullable: false),
55  Tag = table.Column<string>(nullable: true),
56  Id = table.Column<long>(nullable: false)
57  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
58  ChatSettingsId = table.Column<long>(nullable: false)
59  },
60  constraints: table =>
61  {
62  table.PrimaryKey("PK_ChatChannels", x => x.Id);
63  });
64 
65  migrationBuilder.CreateTable(
66  name: "ReattachInformations",
67  columns: table => new
68  {
69  ChatCommandsJson = table.Column<string>(nullable: false),
70  ChatChannelsJson = table.Column<string>(nullable: false),
71  ServerCommandsJson = table.Column<string>(nullable: false),
72  AccessIdentifier = table.Column<string>(nullable: false),
73  ProcessId = table.Column<int>(nullable: false),
74  IsPrimary = table.Column<bool>(nullable: false),
75  Port = table.Column<ushort>(nullable: false),
76  RebootState = table.Column<int>(nullable: false),
77  Id = table.Column<long>(nullable: false)
78  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
79  CompileJobId = table.Column<long>(nullable: true)
80  },
81  constraints: table =>
82  {
83  table.PrimaryKey("PK_ReattachInformations", x => x.Id);
84  });
85 
86  migrationBuilder.CreateTable(
87  name: "WatchdogReattachInformations",
88  columns: table => new
89  {
90  AlphaIsActive = table.Column<bool>(nullable: false),
91  Id = table.Column<long>(nullable: false)
92  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
93  AlphaId = table.Column<long>(nullable: true),
94  BravoId = table.Column<long>(nullable: true)
95  },
96  constraints: table =>
97  {
98  table.PrimaryKey("PK_WatchdogReattachInformations", x => x.Id);
99  table.ForeignKey(
100  name: "FK_WatchdogReattachInformations_ReattachInformations_AlphaId",
101  column: x => x.AlphaId,
102  principalTable: "ReattachInformations",
103  principalColumn: "Id",
104  onDelete: ReferentialAction.Restrict);
105  table.ForeignKey(
106  name: "FK_WatchdogReattachInformations_ReattachInformations_BravoId",
107  column: x => x.BravoId,
108  principalTable: "ReattachInformations",
109  principalColumn: "Id",
110  onDelete: ReferentialAction.Restrict);
111  });
112 
113  migrationBuilder.CreateTable(
114  name: "Instances",
115  columns: table => new
116  {
117  Id = table.Column<long>(nullable: false)
118  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
119  Name = table.Column<string>(nullable: false),
120  Path = table.Column<string>(nullable: false),
121  Online = table.Column<bool>(nullable: false),
122  ConfigurationType = table.Column<int>(nullable: false),
123  AutoUpdateInterval = table.Column<uint>(nullable: false),
124  WatchdogReattachInformationId = table.Column<long>(nullable: true)
125  },
126  constraints: table =>
127  {
128  table.PrimaryKey("PK_Instances", x => x.Id);
129  table.ForeignKey(
130  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
131  column: x => x.WatchdogReattachInformationId,
132  principalTable: "WatchdogReattachInformations",
133  principalColumn: "Id",
134  onDelete: ReferentialAction.Restrict);
135  });
136 
137  migrationBuilder.CreateTable(
138  name: "ChatBots",
139  columns: table => new
140  {
141  Id = table.Column<long>(nullable: false)
142  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
143  Name = table.Column<string>(nullable: false),
144  Enabled = table.Column<bool>(nullable: true),
145  Provider = table.Column<int>(nullable: true),
146  ConnectionString = table.Column<string>(nullable: false),
147  InstanceId = table.Column<long>(nullable: false)
148  },
149  constraints: table =>
150  {
151  table.PrimaryKey("PK_ChatBots", x => x.Id);
152  table.ForeignKey(
153  name: "FK_ChatBots_Instances_InstanceId",
154  column: x => x.InstanceId,
155  principalTable: "Instances",
156  principalColumn: "Id",
157  onDelete: ReferentialAction.Cascade);
158  });
159 
160  migrationBuilder.CreateTable(
161  name: "DreamDaemonSettings",
162  columns: table => new
163  {
164  AllowWebClient = table.Column<bool>(nullable: false),
165  SecurityLevel = table.Column<int>(nullable: false),
166  PrimaryPort = table.Column<ushort>(nullable: false),
167  SecondaryPort = table.Column<ushort>(nullable: false),
168  StartupTimeout = table.Column<uint>(nullable: false),
169  AutoStart = table.Column<bool>(nullable: false),
170  SoftRestart = table.Column<bool>(nullable: false),
171  SoftShutdown = table.Column<bool>(nullable: false),
172  Id = table.Column<long>(nullable: false)
173  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
174  ProcessId = table.Column<int>(nullable: true),
175  AccessToken = table.Column<string>(nullable: true),
176  InstanceId = table.Column<long>(nullable: false)
177  },
178  constraints: table =>
179  {
180  table.PrimaryKey("PK_DreamDaemonSettings", x => x.Id);
181  table.ForeignKey(
182  name: "FK_DreamDaemonSettings_Instances_InstanceId",
183  column: x => x.InstanceId,
184  principalTable: "Instances",
185  principalColumn: "Id",
186  onDelete: ReferentialAction.Cascade);
187  });
188 
189  migrationBuilder.CreateTable(
190  name: "DreamMakerSettings",
191  columns: table => new
192  {
193  ProjectName = table.Column<string>(nullable: true),
194  ApiValidationPort = table.Column<ushort>(nullable: false),
195  Id = table.Column<long>(nullable: false)
196  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
197  InstanceId = table.Column<long>(nullable: false)
198  },
199  constraints: table =>
200  {
201  table.PrimaryKey("PK_DreamMakerSettings", x => x.Id);
202  table.ForeignKey(
203  name: "FK_DreamMakerSettings_Instances_InstanceId",
204  column: x => x.InstanceId,
205  principalTable: "Instances",
206  principalColumn: "Id",
207  onDelete: ReferentialAction.Cascade);
208  });
209 
210  migrationBuilder.CreateTable(
211  name: "InstanceUsers",
212  columns: table => new
213  {
214  UserId = table.Column<long>(nullable: false),
215  InstanceUserRights = table.Column<ulong>(nullable: false),
216  ByondRights = table.Column<ulong>(nullable: false),
217  DreamDaemonRights = table.Column<ulong>(nullable: false),
218  DreamMakerRights = table.Column<ulong>(nullable: false),
219  RepositoryRights = table.Column<ulong>(nullable: false),
220  ChatBotRights = table.Column<ulong>(nullable: false),
221  ConfigurationRights = table.Column<ulong>(nullable: false),
222  Id = table.Column<long>(nullable: false)
223  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
224  InstanceId = table.Column<long>(nullable: false)
225  },
226  constraints: table =>
227  {
228  table.PrimaryKey("PK_InstanceUsers", x => x.Id);
229  table.ForeignKey(
230  name: "FK_InstanceUsers_Instances_InstanceId",
231  column: x => x.InstanceId,
232  principalTable: "Instances",
233  principalColumn: "Id",
234  onDelete: ReferentialAction.Cascade);
235  table.ForeignKey(
236  name: "FK_InstanceUsers_Users_UserId",
237  column: x => x.UserId,
238  principalTable: "Users",
239  principalColumn: "Id",
240  onDelete: ReferentialAction.Cascade);
241  });
242 
243  migrationBuilder.CreateTable(
244  name: "Jobs",
245  columns: table => new
246  {
247  Id = table.Column<long>(nullable: false)
248  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
249  Description = table.Column<string>(nullable: false),
250  ExceptionDetails = table.Column<string>(nullable: true),
251  StartedAt = table.Column<DateTimeOffset>(nullable: false),
252  StoppedAt = table.Column<DateTimeOffset>(nullable: true),
253  Cancelled = table.Column<bool>(nullable: false),
254  CancelRightsType = table.Column<ulong>(nullable: true),
255  CancelRight = table.Column<ulong>(nullable: true),
256  StartedById = table.Column<long>(nullable: false),
257  CancelledById = table.Column<long>(nullable: true),
258  InstanceId = table.Column<long>(nullable: false)
259  },
260  constraints: table =>
261  {
262  table.PrimaryKey("PK_Jobs", x => x.Id);
263  table.ForeignKey(
264  name: "FK_Jobs_Users_CancelledById",
265  column: x => x.CancelledById,
266  principalTable: "Users",
267  principalColumn: "Id",
268  onDelete: ReferentialAction.Restrict);
269  table.ForeignKey(
270  name: "FK_Jobs_Instances_InstanceId",
271  column: x => x.InstanceId,
272  principalTable: "Instances",
273  principalColumn: "Id",
274  onDelete: ReferentialAction.Cascade);
275  table.ForeignKey(
276  name: "FK_Jobs_Users_StartedById",
277  column: x => x.StartedById,
278  principalTable: "Users",
279  principalColumn: "Id",
280  onDelete: ReferentialAction.Cascade);
281  });
282 
283  migrationBuilder.CreateTable(
284  name: "RepositorySettings",
285  columns: table => new
286  {
287  CommitterName = table.Column<string>(nullable: false),
288  CommitterEmail = table.Column<string>(nullable: false),
289  AccessUser = table.Column<string>(nullable: true),
290  AccessToken = table.Column<string>(nullable: true),
291  PushTestMergeCommits = table.Column<bool>(nullable: false),
292  ShowTestMergeCommitters = table.Column<bool>(nullable: false),
293  AutoUpdatesKeepTestMerges = table.Column<bool>(nullable: false),
294  AutoUpdatesSynchronize = table.Column<bool>(nullable: false),
295  Id = table.Column<long>(nullable: false)
296  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
297  InstanceId = table.Column<long>(nullable: false)
298  },
299  constraints: table =>
300  {
301  table.PrimaryKey("PK_RepositorySettings", x => x.Id);
302  table.ForeignKey(
303  name: "FK_RepositorySettings_Instances_InstanceId",
304  column: x => x.InstanceId,
305  principalTable: "Instances",
306  principalColumn: "Id",
307  onDelete: ReferentialAction.Cascade);
308  });
309 
310  migrationBuilder.CreateTable(
311  name: "RevisionInformations",
312  columns: table => new
313  {
314  CommitSha = table.Column<string>(maxLength: 40, nullable: false),
315  OriginCommitSha = table.Column<string>(maxLength: 40, nullable: false),
316  Id = table.Column<long>(nullable: false)
317  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
318  InstanceId = table.Column<long>(nullable: false)
319  },
320  constraints: table =>
321  {
322  table.PrimaryKey("PK_RevisionInformations", x => x.Id);
323  table.ForeignKey(
324  name: "FK_RevisionInformations_Instances_InstanceId",
325  column: x => x.InstanceId,
326  principalTable: "Instances",
327  principalColumn: "Id",
328  onDelete: ReferentialAction.Cascade);
329  });
330 
331  migrationBuilder.CreateTable(
332  name: "CompileJobs",
333  columns: table => new
334  {
335  Id = table.Column<long>(nullable: false)
336  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
337  DmeName = table.Column<string>(nullable: true),
338  Output = table.Column<string>(nullable: true),
339  DirectoryName = table.Column<Guid>(nullable: true),
340  JobId = table.Column<long>(nullable: true),
341  RevisionInformationId = table.Column<long>(nullable: false),
342  ByondVersion = table.Column<string>(nullable: false)
343  },
344  constraints: table =>
345  {
346  table.PrimaryKey("PK_CompileJobs", x => x.Id);
347  table.ForeignKey(
348  name: "FK_CompileJobs_Jobs_JobId",
349  column: x => x.JobId,
350  principalTable: "Jobs",
351  principalColumn: "Id",
352  onDelete: ReferentialAction.Restrict);
353  table.ForeignKey(
354  name: "FK_CompileJobs_RevisionInformations_RevisionInformationId",
355  column: x => x.RevisionInformationId,
356  principalTable: "RevisionInformations",
357  principalColumn: "Id",
358  onDelete: ReferentialAction.Cascade);
359  });
360 
361  migrationBuilder.CreateTable(
362  name: "TestMerges",
363  columns: table => new
364  {
365  Number = table.Column<int>(nullable: false),
366  PullRequestRevision = table.Column<string>(nullable: false),
367  Comment = table.Column<string>(nullable: true),
368  TitleAtMerge = table.Column<string>(nullable: false),
369  BodyAtMerge = table.Column<string>(nullable: false),
370  Url = table.Column<string>(nullable: false),
371  Author = table.Column<string>(nullable: false),
372  Id = table.Column<long>(nullable: false)
373  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
374  MergedAt = table.Column<DateTimeOffset>(nullable: false),
375  MergedById = table.Column<long>(nullable: false),
376  PrimaryRevisionInformationId = table.Column<long>(nullable: true)
377  },
378  constraints: table =>
379  {
380  table.PrimaryKey("PK_TestMerges", x => x.Id);
381  table.ForeignKey(
382  name: "FK_TestMerges_Users_MergedById",
383  column: x => x.MergedById,
384  principalTable: "Users",
385  principalColumn: "Id",
386  onDelete: ReferentialAction.Restrict);
387  table.ForeignKey(
388  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
389  column: x => x.PrimaryRevisionInformationId,
390  principalTable: "RevisionInformations",
391  principalColumn: "Id",
392  onDelete: ReferentialAction.SetNull);
393  });
394 
395  migrationBuilder.CreateTable(
396  name: "RevInfoTestMerges",
397  columns: table => new
398  {
399  Id = table.Column<long>(nullable: false)
400  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
401  TestMergeId = table.Column<long>(nullable: false),
402  RevisionInformationId = table.Column<long>(nullable: false)
403  },
404  constraints: table =>
405  {
406  table.PrimaryKey("PK_RevInfoTestMerges", x => x.Id);
407  table.ForeignKey(
408  name: "FK_RevInfoTestMerges_RevisionInformations_RevisionInformationId",
409  column: x => x.RevisionInformationId,
410  principalTable: "RevisionInformations",
411  principalColumn: "Id",
412  onDelete: ReferentialAction.Cascade);
413  table.ForeignKey(
414  name: "FK_RevInfoTestMerges_TestMerges_TestMergeId",
415  column: x => x.TestMergeId,
416  principalTable: "TestMerges",
417  principalColumn: "Id",
418  onDelete: ReferentialAction.Cascade);
419  });
420 
421  migrationBuilder.CreateIndex(
422  name: "IX_ChatBots_InstanceId",
423  table: "ChatBots",
424  column: "InstanceId");
425 
426  migrationBuilder.CreateIndex(
427  name: "IX_ChatBots_Name",
428  table: "ChatBots",
429  column: "Name",
430  unique: true);
431 
432  migrationBuilder.CreateIndex(
433  name: "IX_ChatChannels_ChatSettingsId_DiscordChannelId",
434  table: "ChatChannels",
435  columns: new[] { "ChatSettingsId", "DiscordChannelId" },
436  unique: true);
437 
438  migrationBuilder.CreateIndex(
439  name: "IX_ChatChannels_ChatSettingsId_IrcChannel",
440  table: "ChatChannels",
441  columns: new[] { "ChatSettingsId", "IrcChannel" },
442  unique: true);
443 
444  migrationBuilder.CreateIndex(
445  name: "IX_CompileJobs_DirectoryName",
446  table: "CompileJobs",
447  column: "DirectoryName");
448 
449  migrationBuilder.CreateIndex(
450  name: "IX_CompileJobs_JobId",
451  table: "CompileJobs",
452  column: "JobId");
453 
454  migrationBuilder.CreateIndex(
455  name: "IX_CompileJobs_RevisionInformationId",
456  table: "CompileJobs",
457  column: "RevisionInformationId");
458 
459  migrationBuilder.CreateIndex(
460  name: "IX_DreamDaemonSettings_InstanceId",
461  table: "DreamDaemonSettings",
462  column: "InstanceId",
463  unique: true);
464 
465  migrationBuilder.CreateIndex(
466  name: "IX_DreamMakerSettings_InstanceId",
467  table: "DreamMakerSettings",
468  column: "InstanceId",
469  unique: true);
470 
471  migrationBuilder.CreateIndex(
472  name: "IX_Instances_Path",
473  table: "Instances",
474  column: "Path",
475  unique: true);
476 
477  migrationBuilder.CreateIndex(
478  name: "IX_Instances_WatchdogReattachInformationId",
479  table: "Instances",
480  column: "WatchdogReattachInformationId");
481 
482  migrationBuilder.CreateIndex(
483  name: "IX_InstanceUsers_InstanceId",
484  table: "InstanceUsers",
485  column: "InstanceId");
486 
487  migrationBuilder.CreateIndex(
488  name: "IX_InstanceUsers_UserId_InstanceId",
489  table: "InstanceUsers",
490  columns: new[] { "UserId", "InstanceId" },
491  unique: true);
492 
493  migrationBuilder.CreateIndex(
494  name: "IX_Jobs_CancelledById",
495  table: "Jobs",
496  column: "CancelledById");
497 
498  migrationBuilder.CreateIndex(
499  name: "IX_Jobs_InstanceId",
500  table: "Jobs",
501  column: "InstanceId");
502 
503  migrationBuilder.CreateIndex(
504  name: "IX_Jobs_StartedById",
505  table: "Jobs",
506  column: "StartedById");
507 
508  migrationBuilder.CreateIndex(
509  name: "IX_ReattachInformations_CompileJobId",
510  table: "ReattachInformations",
511  column: "CompileJobId");
512 
513  migrationBuilder.CreateIndex(
514  name: "IX_RepositorySettings_InstanceId",
515  table: "RepositorySettings",
516  column: "InstanceId",
517  unique: true);
518 
519  migrationBuilder.CreateIndex(
520  name: "IX_RevInfoTestMerges_RevisionInformationId",
521  table: "RevInfoTestMerges",
522  column: "RevisionInformationId");
523 
524  migrationBuilder.CreateIndex(
525  name: "IX_RevInfoTestMerges_TestMergeId",
526  table: "RevInfoTestMerges",
527  column: "TestMergeId");
528 
529  migrationBuilder.CreateIndex(
530  name: "IX_RevisionInformations_CommitSha",
531  table: "RevisionInformations",
532  column: "CommitSha",
533  unique: true);
534 
535  migrationBuilder.CreateIndex(
536  name: "IX_RevisionInformations_InstanceId",
537  table: "RevisionInformations",
538  column: "InstanceId");
539 
540  migrationBuilder.CreateIndex(
541  name: "IX_TestMerges_MergedById",
542  table: "TestMerges",
543  column: "MergedById");
544 
545  migrationBuilder.CreateIndex(
546  name: "IX_TestMerges_PrimaryRevisionInformationId",
547  table: "TestMerges",
548  column: "PrimaryRevisionInformationId",
549  unique: true);
550 
551  migrationBuilder.CreateIndex(
552  name: "IX_Users_CanonicalName",
553  table: "Users",
554  column: "CanonicalName",
555  unique: true);
556 
557  migrationBuilder.CreateIndex(
558  name: "IX_Users_CreatedById",
559  table: "Users",
560  column: "CreatedById");
561 
562  migrationBuilder.CreateIndex(
563  name: "IX_WatchdogReattachInformations_AlphaId",
564  table: "WatchdogReattachInformations",
565  column: "AlphaId");
566 
567  migrationBuilder.CreateIndex(
568  name: "IX_WatchdogReattachInformations_BravoId",
569  table: "WatchdogReattachInformations",
570  column: "BravoId");
571 
572  migrationBuilder.AddForeignKey(
573  name: "FK_ChatChannels_ChatBots_ChatSettingsId",
574  table: "ChatChannels",
575  column: "ChatSettingsId",
576  principalTable: "ChatBots",
577  principalColumn: "Id",
578  onDelete: ReferentialAction.Cascade);
579 
580  migrationBuilder.AddForeignKey(
581  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
582  table: "ReattachInformations",
583  column: "CompileJobId",
584  principalTable: "CompileJobs",
585  principalColumn: "Id",
586  onDelete: ReferentialAction.Restrict);
587  }
588 
593  protected override void Down(MigrationBuilder migrationBuilder)
594  {
595  migrationBuilder.DropForeignKey(
596  name: "FK_Jobs_Instances_InstanceId",
597  table: "Jobs");
598 
599  migrationBuilder.DropForeignKey(
600  name: "FK_RevisionInformations_Instances_InstanceId",
601  table: "RevisionInformations");
602 
603  migrationBuilder.DropTable(
604  name: "ChatChannels");
605 
606  migrationBuilder.DropTable(
607  name: "DreamDaemonSettings");
608 
609  migrationBuilder.DropTable(
610  name: "DreamMakerSettings");
611 
612  migrationBuilder.DropTable(
613  name: "InstanceUsers");
614 
615  migrationBuilder.DropTable(
616  name: "RepositorySettings");
617 
618  migrationBuilder.DropTable(
619  name: "RevInfoTestMerges");
620 
621  migrationBuilder.DropTable(
622  name: "ChatBots");
623 
624  migrationBuilder.DropTable(
625  name: "TestMerges");
626 
627  migrationBuilder.DropTable(
628  name: "Instances");
629 
630  migrationBuilder.DropTable(
631  name: "WatchdogReattachInformations");
632 
633  migrationBuilder.DropTable(
634  name: "ReattachInformations");
635 
636  migrationBuilder.DropTable(
637  name: "CompileJobs");
638 
639  migrationBuilder.DropTable(
640  name: "Jobs");
641 
642  migrationBuilder.DropTable(
643  name: "RevisionInformations");
644 
645  migrationBuilder.DropTable(
646  name: "Users");
647  }
648  }
649 }
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
+
The initial database migration for MySQL/MariaDB
+
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..ccd6b40bcd --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..cc98992d8a --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models.Migrations
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..a6c12e50b8 --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d0c2242406 --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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;
3 
4 namespace Tgstation.Server.Host.Models.Migrations
5 {
9  public partial class MYAddMinimumSecurity : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  migrationBuilder.AddColumn<int>(
18  name: "ApiValidationSecurityLevel",
19  table: "DreamMakerSettings",
20  nullable: false,
21  defaultValue: (int)DreamDaemonSecurity.Safe);
22 
23  migrationBuilder.AddColumn<int>(
24  name: "MinimumSecurityLevel",
25  table: "CompileJobs",
26  nullable: false,
27  defaultValue: (int)DreamDaemonSecurity.Safe);
28  }
29 
34  protected override void Down(MigrationBuilder migrationBuilder)
35  {
36  migrationBuilder.DropColumn(
37  name: "ApiValidationSecurityLevel",
38  table: "DreamMakerSettings");
39 
40  migrationBuilder.DropColumn(
41  name: "MinimumSecurityLevel",
42  table: "CompileJobs");
43  }
44  }
45 }
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ + +
Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel...
+ + + +
DreamDaemonSecurity
DreamDaemon&#39;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..ab5b2adb9e --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6d8dee7f1c --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Models.Migrations
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..70fcf94230 --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5575f75a98 --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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;
3 
4 namespace Tgstation.Server.Host.Models.Migrations
5 {
9  public partial class MSAddMinimumSecurity : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  migrationBuilder.AddColumn<int>(
18  name: "ApiValidationSecurityLevel",
19  table: "DreamMakerSettings",
20  nullable: false,
21  defaultValue: (int)DreamDaemonSecurity.Safe);
22 
23  migrationBuilder.AddColumn<int>(
24  name: "MinimumSecurityLevel",
25  table: "CompileJobs",
26  nullable: false,
27  defaultValue: (int)DreamDaemonSecurity.Safe);
28  }
29 
34  protected override void Down(MigrationBuilder migrationBuilder)
35  {
36  migrationBuilder.DropColumn(
37  name: "ApiValidationSecurityLevel",
38  table: "DreamMakerSettings");
39 
40  migrationBuilder.DropColumn(
41  name: "MinimumSecurityLevel",
42  table: "CompileJobs");
43  }
44  }
45 }
+ +
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&#39;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..927b218703 --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..b1decfd7fa --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models.Migrations
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..96e7a692bd --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..4ce3489673 --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Models.Migrations
5 {
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  migrationBuilder.DropForeignKey(
18  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
19  table: "Instances");
20 
21  migrationBuilder.DropForeignKey(
22  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
23  table: "TestMerges");
24 
25  migrationBuilder.DropForeignKey(
26  name: "FK_CompileJobs_Jobs_JobId",
27  table: "CompileJobs");
28 
29  migrationBuilder.DropIndex(
30  name: "IX_Instances_WatchdogReattachInformationId",
31  table: "Instances");
32 
33  migrationBuilder.DropIndex(
34  name: "IX_CompileJobs_JobId",
35  table: "CompileJobs");
36 
37  migrationBuilder.DropColumn(
38  name: "WatchdogReattachInformationId",
39  table: "Instances");
40 
41  migrationBuilder.AddColumn<long>(
42  name: "InstanceId",
43  table: "WatchdogReattachInformations",
44  nullable: false,
45  defaultValue: 0L);
46 
47  migrationBuilder.AlterColumn<long>(
48  name: "PrimaryRevisionInformationId",
49  table: "TestMerges",
50  nullable: false,
51  oldClrType: typeof(long),
52  oldNullable: true);
53 
54  migrationBuilder.AlterColumn<string>(
55  name: "Output",
56  table: "CompileJobs",
57  nullable: false,
58  oldClrType: typeof(string),
59  oldNullable: true);
60 
61  migrationBuilder.AlterColumn<long>(
62  name: "JobId",
63  table: "CompileJobs",
64  nullable: false,
65  oldClrType: typeof(long),
66  oldNullable: true);
67 
68  migrationBuilder.AlterColumn<string>(
69  name: "DmeName",
70  table: "CompileJobs",
71  nullable: false,
72  oldClrType: typeof(string),
73  oldNullable: true);
74 
75  migrationBuilder.AlterColumn<Guid>(
76  name: "DirectoryName",
77  table: "CompileJobs",
78  nullable: false,
79  oldClrType: typeof(Guid),
80  oldNullable: true);
81 
82  migrationBuilder.CreateIndex(
83  name: "IX_WatchdogReattachInformations_InstanceId",
84  table: "WatchdogReattachInformations",
85  column: "InstanceId",
86  unique: true);
87 
88  migrationBuilder.CreateIndex(
89  name: "IX_CompileJobs_JobId",
90  table: "CompileJobs",
91  column: "JobId",
92  unique: true);
93 
94  migrationBuilder.AddForeignKey(
95  name: "FK_CompileJobs_Jobs_JobId",
96  table: "CompileJobs",
97  column: "JobId",
98  principalTable: "Jobs",
99  principalColumn: "Id",
100  onDelete: ReferentialAction.Restrict);
101 
102  migrationBuilder.AddForeignKey(
103  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
104  table: "TestMerges",
105  column: "PrimaryRevisionInformationId",
106  principalTable: "RevisionInformations",
107  principalColumn: "Id",
108  onDelete: ReferentialAction.Restrict);
109 
110  migrationBuilder.AddForeignKey(
111  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
112  table: "WatchdogReattachInformations",
113  column: "InstanceId",
114  principalTable: "Instances",
115  principalColumn: "Id",
116  onDelete: ReferentialAction.Cascade);
117  }
118 
123  protected override void Down(MigrationBuilder migrationBuilder)
124  {
125  migrationBuilder.DropForeignKey(
126  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
127  table: "TestMerges");
128 
129  migrationBuilder.DropForeignKey(
130  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
131  table: "WatchdogReattachInformations");
132 
133  migrationBuilder.DropForeignKey(
134  name: "FK_CompileJobs_Jobs_JobId",
135  table: "CompileJobs");
136 
137  migrationBuilder.DropIndex(
138  name: "IX_WatchdogReattachInformations_InstanceId",
139  table: "WatchdogReattachInformations");
140 
141  migrationBuilder.DropIndex(
142  name: "IX_CompileJobs_JobId",
143  table: "CompileJobs");
144 
145  migrationBuilder.DropColumn(
146  name: "InstanceId",
147  table: "WatchdogReattachInformations");
148 
149  migrationBuilder.AlterColumn<long>(
150  name: "PrimaryRevisionInformationId",
151  table: "TestMerges",
152  nullable: true,
153  oldClrType: typeof(long));
154 
155  migrationBuilder.AddColumn<long>(
156  name: "WatchdogReattachInformationId",
157  table: "Instances",
158  nullable: true);
159 
160  migrationBuilder.AlterColumn<string>(
161  name: "Output",
162  table: "CompileJobs",
163  nullable: true,
164  oldClrType: typeof(string));
165 
166  migrationBuilder.AlterColumn<long>(
167  name: "JobId",
168  table: "CompileJobs",
169  nullable: true,
170  oldClrType: typeof(long));
171 
172  migrationBuilder.AlterColumn<string>(
173  name: "DmeName",
174  table: "CompileJobs",
175  nullable: true,
176  oldClrType: typeof(string));
177 
178  migrationBuilder.AlterColumn<Guid>(
179  name: "DirectoryName",
180  table: "CompileJobs",
181  nullable: true,
182  oldClrType: typeof(Guid));
183 
184  migrationBuilder.CreateIndex(
185  name: "IX_Instances_WatchdogReattachInformationId",
186  table: "Instances",
187  column: "WatchdogReattachInformationId");
188 
189  migrationBuilder.CreateIndex(
190  name: "IX_CompileJobs_JobId",
191  table: "CompileJobs",
192  column: "JobId");
193 
194  migrationBuilder.AddForeignKey(
195  name: "FK_CompileJobs_Jobs_JobId",
196  table: "CompileJobs",
197  column: "JobId",
198  principalTable: "Jobs",
199  principalColumn: "Id",
200  onDelete: ReferentialAction.Restrict);
201 
202  migrationBuilder.AddForeignKey(
203  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
204  table: "Instances",
205  column: "WatchdogReattachInformationId",
206  principalTable: "WatchdogReattachInformations",
207  principalColumn: "Id",
208  onDelete: ReferentialAction.Restrict);
209 
210  migrationBuilder.AddForeignKey(
211  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
212  table: "TestMerges",
213  column: "PrimaryRevisionInformationId",
214  principalTable: "RevisionInformations",
215  principalColumn: "Id",
216  onDelete: ReferentialAction.SetNull);
217  }
218  }
219 }
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..f0531b62a0 --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..9f3a1505c6 --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Models.Migrations
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..824a4282ab --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..a8588c5485 --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Models.Migrations
5 {
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  migrationBuilder.DropForeignKey(
18  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
19  table: "Instances");
20 
21  migrationBuilder.DropForeignKey(
22  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
23  table: "TestMerges");
24 
25  migrationBuilder.DropIndex(
26  name: "IX_TestMerges_PrimaryRevisionInformationId",
27  table: "TestMerges");
28 
29  migrationBuilder.DropIndex(
30  name: "IX_Instances_WatchdogReattachInformationId",
31  table: "Instances");
32 
33  migrationBuilder.DropIndex(
34  name: "IX_CompileJobs_JobId",
35  table: "CompileJobs");
36 
37  migrationBuilder.DropColumn(
38  name: "WatchdogReattachInformationId",
39  table: "Instances");
40 
41  migrationBuilder.AddColumn<long>(
42  name: "InstanceId",
43  table: "WatchdogReattachInformations",
44  nullable: false,
45  defaultValue: 0L);
46 
47  migrationBuilder.AlterColumn<long>(
48  name: "PrimaryRevisionInformationId",
49  table: "TestMerges",
50  nullable: false,
51  oldClrType: typeof(long),
52  oldNullable: true);
53 
54  migrationBuilder.AlterColumn<string>(
55  name: "Output",
56  table: "CompileJobs",
57  nullable: false,
58  oldClrType: typeof(string),
59  oldNullable: true);
60 
61  migrationBuilder.AlterColumn<long>(
62  name: "JobId",
63  table: "CompileJobs",
64  nullable: false,
65  oldClrType: typeof(long),
66  oldNullable: true);
67 
68  migrationBuilder.AlterColumn<string>(
69  name: "DmeName",
70  table: "CompileJobs",
71  nullable: false,
72  oldClrType: typeof(string),
73  oldNullable: true);
74 
75  migrationBuilder.AlterColumn<Guid>(
76  name: "DirectoryName",
77  table: "CompileJobs",
78  nullable: false,
79  oldClrType: typeof(Guid),
80  oldNullable: true);
81 
82  migrationBuilder.CreateIndex(
83  name: "IX_WatchdogReattachInformations_InstanceId",
84  table: "WatchdogReattachInformations",
85  column: "InstanceId",
86  unique: true);
87 
88  migrationBuilder.CreateIndex(
89  name: "IX_TestMerges_PrimaryRevisionInformationId",
90  table: "TestMerges",
91  column: "PrimaryRevisionInformationId",
92  unique: true);
93 
94  migrationBuilder.CreateIndex(
95  name: "IX_CompileJobs_JobId",
96  table: "CompileJobs",
97  column: "JobId",
98  unique: true);
99 
100  migrationBuilder.AddForeignKey(
101  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
102  table: "TestMerges",
103  column: "PrimaryRevisionInformationId",
104  principalTable: "RevisionInformations",
105  principalColumn: "Id",
106  onDelete: ReferentialAction.Restrict);
107 
108  migrationBuilder.AddForeignKey(
109  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
110  table: "WatchdogReattachInformations",
111  column: "InstanceId",
112  principalTable: "Instances",
113  principalColumn: "Id",
114  onDelete: ReferentialAction.Cascade);
115  }
116 
121  protected override void Down(MigrationBuilder migrationBuilder)
122  {
123  migrationBuilder.DropForeignKey(
124  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
125  table: "TestMerges");
126 
127  migrationBuilder.DropForeignKey(
128  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
129  table: "WatchdogReattachInformations");
130 
131  migrationBuilder.DropIndex(
132  name: "IX_WatchdogReattachInformations_InstanceId",
133  table: "WatchdogReattachInformations");
134 
135  migrationBuilder.DropIndex(
136  name: "IX_TestMerges_PrimaryRevisionInformationId",
137  table: "TestMerges");
138 
139  migrationBuilder.DropIndex(
140  name: "IX_CompileJobs_JobId",
141  table: "CompileJobs");
142 
143  migrationBuilder.DropColumn(
144  name: "InstanceId",
145  table: "WatchdogReattachInformations");
146 
147  migrationBuilder.AlterColumn<long>(
148  name: "PrimaryRevisionInformationId",
149  table: "TestMerges",
150  nullable: true,
151  oldClrType: typeof(long));
152 
153  migrationBuilder.AddColumn<long>(
154  name: "WatchdogReattachInformationId",
155  table: "Instances",
156  nullable: true);
157 
158  migrationBuilder.AlterColumn<string>(
159  name: "Output",
160  table: "CompileJobs",
161  nullable: true,
162  oldClrType: typeof(string));
163 
164  migrationBuilder.AlterColumn<long>(
165  name: "JobId",
166  table: "CompileJobs",
167  nullable: true,
168  oldClrType: typeof(long));
169 
170  migrationBuilder.AlterColumn<string>(
171  name: "DmeName",
172  table: "CompileJobs",
173  nullable: true,
174  oldClrType: typeof(string));
175 
176  migrationBuilder.AlterColumn<Guid>(
177  name: "DirectoryName",
178  table: "CompileJobs",
179  nullable: true,
180  oldClrType: typeof(Guid));
181 
182  migrationBuilder.CreateIndex(
183  name: "IX_TestMerges_PrimaryRevisionInformationId",
184  table: "TestMerges",
185  column: "PrimaryRevisionInformationId",
186  unique: true,
187  filter: "[PrimaryRevisionInformationId] IS NOT NULL");
188 
189  migrationBuilder.CreateIndex(
190  name: "IX_Instances_WatchdogReattachInformationId",
191  table: "Instances",
192  column: "WatchdogReattachInformationId");
193 
194  migrationBuilder.CreateIndex(
195  name: "IX_CompileJobs_JobId",
196  table: "CompileJobs",
197  column: "JobId");
198 
199  migrationBuilder.AddForeignKey(
200  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
201  table: "Instances",
202  column: "WatchdogReattachInformationId",
203  principalTable: "WatchdogReattachInformations",
204  principalColumn: "Id",
205  onDelete: ReferentialAction.Restrict);
206 
207  migrationBuilder.AddForeignKey(
208  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
209  table: "TestMerges",
210  column: "PrimaryRevisionInformationId",
211  principalTable: "RevisionInformations",
212  principalColumn: "Id",
213  onDelete: ReferentialAction.SetNull);
214  }
215  }
216 }
+
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..3d72b271e0 --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..0ed606ff5a --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Models.Migrations
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..68f5878f66 --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..c559d1d769 --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models.Migrations
4 {
8  public partial class MSReattachCompileJobRequired : Migration
9  {
14  protected override void Up(MigrationBuilder migrationBuilder)
15  {
16  migrationBuilder.DropForeignKey(
17  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
18  table: "ReattachInformations");
19 
20  migrationBuilder.AlterColumn<long>(
21  name: "CompileJobId",
22  table: "ReattachInformations",
23  nullable: false,
24  oldClrType: typeof(long),
25  oldNullable: true);
26 
27  migrationBuilder.AddForeignKey(
28  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
29  table: "ReattachInformations",
30  column: "CompileJobId",
31  principalTable: "CompileJobs",
32  principalColumn: "Id",
33  onDelete: ReferentialAction.Cascade);
34  }
35 
40  protected override void Down(MigrationBuilder migrationBuilder)
41  {
42  migrationBuilder.DropForeignKey(
43  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
44  table: "ReattachInformations");
45 
46  migrationBuilder.AlterColumn<long>(
47  name: "CompileJobId",
48  table: "ReattachInformations",
49  nullable: true,
50  oldClrType: typeof(long));
51 
52  migrationBuilder.AddForeignKey(
53  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
54  table: "ReattachInformations",
55  column: "CompileJobId",
56  principalTable: "CompileJobs",
57  principalColumn: "Id",
58  onDelete: ReferentialAction.Restrict);
59  }
60  }
61 }
+ +
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..6da785980f --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..a802c577a6 --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models.Migrations
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..69c0259da8 --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5a7289b0bd --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models.Migrations
4 {
8  public partial class MYReattachCompileJobRequired : Migration
9  {
14  protected override void Up(MigrationBuilder migrationBuilder)
15  {
16  migrationBuilder.DropForeignKey(
17  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
18  table: "ReattachInformations");
19 
20  migrationBuilder.AlterColumn<long>(
21  name: "CompileJobId",
22  table: "ReattachInformations",
23  nullable: false,
24  oldClrType: typeof(long),
25  oldNullable: true);
26 
27  migrationBuilder.AddForeignKey(
28  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
29  table: "ReattachInformations",
30  column: "CompileJobId",
31  principalTable: "CompileJobs",
32  principalColumn: "Id",
33  onDelete: ReferentialAction.Cascade);
34  }
35 
40  protected override void Down(MigrationBuilder migrationBuilder)
41  {
42  migrationBuilder.DropForeignKey(
43  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
44  table: "ReattachInformations");
45 
46  migrationBuilder.AlterColumn<long>(
47  name: "CompileJobId",
48  table: "ReattachInformations",
49  nullable: true,
50  oldClrType: typeof(long));
51 
52  migrationBuilder.AddForeignKey(
53  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
54  table: "ReattachInformations",
55  column: "CompileJobId",
56  principalTable: "CompileJobs",
57  principalColumn: "Id",
58  onDelete: ReferentialAction.Restrict);
59  }
60  }
61 }
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/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..7782f50d28 --- /dev/null +++ b/_a_p_i_8dox.html @@ -0,0 +1,99 @@ + + + + + + +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..3a17812e82 --- /dev/null +++ b/_administration_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Administration.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Administration.cs File Reference
+
+ + + + + diff --git a/_administration_8cs_source.html b/_administration_8cs_source.html new file mode 100644 index 0000000000..28e4f56be2 --- /dev/null +++ b/_administration_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
4 {
6  public sealed class Administration
7  {
11  public bool WindowsHost { get; set; }
12 
16  public Uri TrackedRepositoryUrl { get; set; }
17 
21  public Version LatestVersion { get; set; }
22 
26  public Version NewVersion { get; set; }
27  }
28 }
+ + + +
+ + + + diff --git a/_administration_client_8cs.html b/_administration_client_8cs.html new file mode 100644 index 0000000000..e54ec1ce66 --- /dev/null +++ b/_administration_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_administration_client_8cs_source.html b/_administration_client_8cs_source.html new file mode 100644 index 0000000000..11eff202ac --- /dev/null +++ b/_administration_client_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
7 namespace Tgstation.Server.Client
8 {
11  {
16 
21  public AdministrationClient(IApiClient apiClient)
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 }
+
AdministrationClient(IApiClient apiClient)
Construct an AdministrationClient
+ + + +
const string Administration
The Models.Administration controller
Definition: Routes.cs:19
+ +
readonly IApiClient apiClient
The apiClient for the AdministrationClient
+ +
Routes to a server actions
Definition: Routes.cs:9
+ + +
Web interface for the API
Definition: IApiClient.cs:11
+ +
+ + + + diff --git a/_administration_controller_8cs.html b/_administration_controller_8cs.html new file mode 100644 index 0000000000..56b765e8a2 --- /dev/null +++ b/_administration_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/AdministrationController.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AdministrationController.cs File Reference
+
+ + + + + diff --git a/_administration_controller_8cs_source.html b/_administration_controller_8cs_source.html new file mode 100644 index 0000000000..8716d9a377 --- /dev/null +++ b/_administration_controller_8cs_source.html @@ -0,0 +1,145 @@ + + + + + + +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.Runtime.InteropServices;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using Tgstation.Server.Api;
19 using Tgstation.Server.Host.IO;
22 
23 namespace Tgstation.Server.Host.Controllers
24 {
28  [Route(Routes.Administration)]
29  public sealed class AdministrationController : ModelController<Administration>
30  {
31  const string RestartNotSupportedException = "This deployment of tgstation-server is lacking the Tgstation.Server.Host.Watchdog component. Restarts and version changes cannot be completed!";
32 
33  const string OctokitException = "Bad GitHub API response, check configuration! Exception: {0}";
34 
39 
44 
49 
54 
59 
64 
69 
83  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)
84  {
85  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
86  this.serverUpdater = serverUpdater ?? throw new ArgumentNullException(nameof(serverUpdater));
87  this.application = application ?? throw new ArgumentNullException(nameof(application));
88  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
89  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
90  updatesConfiguration = updatesConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(updatesConfigurationOptions));
91  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
92  }
93 
94  StatusCodeResult RateLimit(RateLimitExceededException exception)
95  {
96  Logger.LogWarning("Exceeded GitHub rate limit! Exception {0}", exception);
97  var secondsString = Math.Ceiling((exception.Reset - DateTimeOffset.Now).TotalSeconds).ToString(CultureInfo.InvariantCulture);
98  Response.Headers.Add("Retry-After", new StringValues(secondsString));
99  return StatusCode(429);
100  }
101 
102  IGitHubClient GetGitHubClient() => String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken) ? gitHubClientFactory.CreateClient() : gitHubClientFactory.CreateClient(generalConfiguration.GitHubAccessToken);
103 
105  [TgsAuthorize]
106  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
107  {
108  try
109  {
110  Version greatestVersion = null;
111  Uri repoUrl = null;
112  try
113  {
114  var gitHubClient = GetGitHubClient();
115  var repositoryTask = gitHubClient.Repository.Get(updatesConfiguration.GitHubRepositoryId);
116  var releases = (await gitHubClient.Repository.Release.GetAll(updatesConfiguration.GitHubRepositoryId).ConfigureAwait(false)).Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
117 
118  foreach (var I in releases)
119  if (Version.TryParse(I.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version)
120  && version.Major == application.Version.Major
121  && (greatestVersion == null || version > greatestVersion))
122  greatestVersion = version;
123  repoUrl = new Uri((await repositoryTask.ConfigureAwait(false)).HtmlUrl);
124  }
125  catch (NotFoundException e)
126  {
127  Logger.LogWarning("Not found exception while retrieving upstream repository info: {0}", e);
128  }
129  return Json(new Administration
130  {
131  LatestVersion = greatestVersion,
132  TrackedRepositoryUrl = repoUrl,
133  WindowsHost = platformIdentifier.IsWindows
134  });
135  }
136  catch (RateLimitExceededException e)
137  {
138  return RateLimit(e);
139  }
140  catch (ApiException e)
141  {
142  Logger.LogWarning(OctokitException, e);
143  return StatusCode((int)HttpStatusCode.FailedDependency);
144  }
145  }
146 
148  [TgsAuthorize(AdministrationRights.ChangeVersion)]
149  public override async Task<IActionResult> Update([FromBody] Administration model, CancellationToken cancellationToken)
150  {
151  if (model == null)
152  throw new ArgumentNullException(nameof(model));
153 
154  if (model.NewVersion == null)
155  return BadRequest(new ErrorMessage { Message = "Missing new version!" });
156 
157  if (model.NewVersion.Major != application.Version.Major)
158  return BadRequest(new ErrorMessage { Message = "Cannot update to a different suite version!" });
159 
160  if(!serverUpdater.WatchdogPresent)
161  return UnprocessableEntity(new ErrorMessage
162  {
163  Message = RestartNotSupportedException
164  });
165 
166  Logger.LogDebug("Looking for GitHub releases version {0}...", model.NewVersion);
167  IEnumerable<Release> releases;
168  try
169  {
170  var gitHubClient = GetGitHubClient();
171  releases = (await gitHubClient.Repository.Release.GetAll(updatesConfiguration.GitHubRepositoryId).ConfigureAwait(false)).Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
172  cancellationToken.ThrowIfCancellationRequested();
173  }
174  catch (RateLimitExceededException e)
175  {
176  return RateLimit(e);
177  }
178  catch (ApiException e)
179  {
180  Logger.LogWarning(OctokitException, e);
181  return StatusCode((int)HttpStatusCode.FailedDependency);
182  }
183 
184  Logger.LogTrace("Release query complete!");
185  foreach (var release in releases)
186  if (Version.TryParse(release.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version) && version == model.NewVersion)
187  {
188  var asset = release.Assets.Where(x => x.Name == updatesConfiguration.UpdatePackageAssetName).FirstOrDefault();
189  if (asset == default)
190  continue;
191 
192  if (!serverUpdater.ApplyUpdate(version, new Uri(asset.BrowserDownloadUrl), ioManager))
193  return Conflict(new ErrorMessage
194  {
195  Message = "An update operation is already in progress!"
196  });
197  return Accepted(); //gtfo of here before all the cancellation tokens fire
198  }
199 
200  return StatusCode((int)HttpStatusCode.Gone);
201  }
202 
204  [HttpDelete]
205  [TgsAuthorize(AdministrationRights.RestartHost)]
206  public async Task<IActionResult> Delete()
207  {
208  try
209  {
210  if (!serverUpdater.WatchdogPresent)
211  {
212  Logger.LogDebug("Restart request failed due to lack of host watchdog!");
213  return UnprocessableEntity(new ErrorMessage
214  {
215  Message = RestartNotSupportedException
216  });
217  }
218  await serverUpdater.Restart().ConfigureAwait(false);
219  return Ok();
220  }
221  catch (InvalidOperationException)
222  {
223  return StatusCode((int)HttpStatusCode.ServiceUnavailable);
224  }
225  }
226  }
227 }
+ +
override async Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+ + + +
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
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
+
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)
+ + +
Configuration for the automatic update system
+
Routes to a server actions
Definition: Routes.cs:9
+ +
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
+
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
+ +
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..971e38060b --- /dev/null +++ b/_administration_rights_8cs.html @@ -0,0 +1,129 @@ + + + + + + +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..7e905b6e78 --- /dev/null +++ b/_administration_rights_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum AdministrationRights : ulong
10  {
14  None = 0,
18  WriteUsers = 1,
22  RestartHost = 2,
26  ChangeVersion = 4,
30  EditOwnPassword = 8,
34  ReadUsers = 16
35  }
36 }
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..a7f6599cf9 --- /dev/null +++ b/_administration_test_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Tests
 
+
+ + + + diff --git a/_administration_test_8cs_source.html b/_administration_test_8cs_source.html new file mode 100644 index 0000000000..1b07889e1d --- /dev/null +++ b/_administration_test_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
9 namespace Tgstation.Server.Tests
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
+ + + + +
AdministrationTest(IAdministrationClient client)
+
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...
+ +
readonly IAdministrationClient client
+ +
+ + + + diff --git a/_api_client_8cs.html b/_api_client_8cs.html new file mode 100644 index 0000000000..f2150b8b02 --- /dev/null +++ b/_api_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_api_client_8cs_source.html b/_api_client_8cs_source.html new file mode 100644 index 0000000000..06b012459b --- /dev/null +++ b/_api_client_8cs_source.html @@ -0,0 +1,132 @@ + + + + + + +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 
15 namespace Tgstation.Server.Client
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 
58  public ApiClient(IHttpClient httpClient, Uri url, ApiHeaders apiHeaders)
59  {
60  this.httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
61  Url = url ?? throw new ArgumentNullException(nameof(url));
62  headers = apiHeaders ?? throw new ArgumentNullException(nameof(apiHeaders));
63 
64  requestLoggers = new List<IRequestLogger>();
65  }
66 
68  public void Dispose() => httpClient.Dispose();
69 
79  async Task<TResult> RunRequest<TResult>(string route, object body, HttpMethod method, long? instanceId, CancellationToken cancellationToken)
80  {
81  if (route == null)
82  throw new ArgumentNullException(nameof(route));
83  if (method == null)
84  throw new ArgumentNullException(nameof(method));
85  if (body == null && (method == HttpMethod.Post || method == HttpMethod.Put))
86  throw new InvalidOperationException("Body cannot be null for POST or PUT!");
87 
88  var fullUri = new Uri(Url, route);
89 
90  var message = new HttpRequestMessage(method, fullUri);
91 
92  var serializerSettings = new JsonSerializerSettings
93  {
94  ContractResolver = new CamelCasePropertyNamesContractResolver(),
95  Converters = new[] { new VersionConverter() }
96  };
97 
98  if (body != null)
99  message.Content = new StringContent(JsonConvert.SerializeObject(body, serializerSettings), Encoding.UTF8, ApiHeaders.ApplicationJson);
100 
101  headers.SetRequestHeaders(message.Headers, instanceId);
102 
103  await Task.WhenAll(requestLoggers.Select(x => x.LogRequest(message, cancellationToken))).ConfigureAwait(false);
104 
105  var response = await httpClient.SendAsync(message, cancellationToken).ConfigureAwait(false);
106 
107  await Task.WhenAll(requestLoggers.Select(x => x.LogResponse(response, cancellationToken))).ConfigureAwait(false);
108 
109  var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
110 
111  if (!response.IsSuccessStatusCode)
112  {
113  ErrorMessage errorMessage = null;
114  try
115  {
116  //check if json serializes to an error message
117  errorMessage = JsonConvert.DeserializeObject<ErrorMessage>(json, serializerSettings);
118  }
119  catch (JsonException) { }
120 
121  const string BadSpecExtension = " This is not part of TGS4 communication specification and should be reported if it was returned from a TGS4 server!";
122 
123  switch (response.StatusCode)
124  {
125  case HttpStatusCode.UpgradeRequired:
126  throw new ApiMismatchException(errorMessage ?? new ErrorMessage
127  {
128  Message = "API Mismatch but no current API version provided!" + BadSpecExtension,
129  SeverApiVersion = null
130  });
131  case HttpStatusCode.Unauthorized:
132  throw new UnauthorizedException();
133  case HttpStatusCode.RequestTimeout:
134  throw new RequestTimeoutException();
135  case HttpStatusCode.Forbidden:
137  case HttpStatusCode.ServiceUnavailable:
138  throw new ServiceUnavailableException();
139  case HttpStatusCode.Gone:
140  errorMessage = errorMessage ?? new ErrorMessage
141  {
142  Message = "The requested resource could not be found!",
143  SeverApiVersion = null
144  };
145  goto case HttpStatusCode.Conflict;
146  case HttpStatusCode.NotFound: //our fault somehow
147  errorMessage = errorMessage ?? new ErrorMessage
148  {
149  Message = "This is not a valid route!" + BadSpecExtension,
150  SeverApiVersion = null
151  };
152  goto case HttpStatusCode.Conflict;
153  case HttpStatusCode.Conflict:
154  throw new ConflictException(errorMessage ?? new ErrorMessage
155  {
156  Message = "An undescribed conflict occurred!" + BadSpecExtension,
157  SeverApiVersion = null
158  }, response.StatusCode);
159  case HttpStatusCode.NotImplemented:
160  case (HttpStatusCode)422: //unprocessable entity
161  throw new MethodNotSupportedException();
162  case HttpStatusCode.InternalServerError:
163  //response
164  throw new ServerErrorException(json); //json is html
165  case (HttpStatusCode)429: //rate limited
166  response.Headers.TryGetValues("Retry-After", out var values);
167  throw new RateLimitException(values?.FirstOrDefault());
168  default:
169  throw new ApiConflictException(errorMessage, response.StatusCode);
170  }
171  }
172 
173  if (String.IsNullOrWhiteSpace(json))
174  json = JsonConvert.SerializeObject(new object());
175 
176  try
177  {
178  return JsonConvert.DeserializeObject<TResult>(json, serializerSettings);
179  }
180  catch (JsonException)
181  {
182  throw new UnrecognizedResponseException(json, response.StatusCode);
183  }
184  }
185 
187  public Task<TResult> Create<TResult>(string route, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), HttpMethod.Put, null, cancellationToken);
188 
190  public Task<TResult> Read<TResult>(string route, CancellationToken cancellationToken) => RunRequest<TResult>(route, null, HttpMethod.Get, null, cancellationToken);
191 
193  public Task<TResult> Update<TResult>(string route, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), HttpMethod.Post, null, cancellationToken);
194 
196  public Task<TResult> Update<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Post, null, cancellationToken);
197 
199  public Task Update<TBody>(string route, TBody body, CancellationToken cancellationToken) => RunRequest<object>(route, body, HttpMethod.Post, null, cancellationToken);
200 
202  public Task<TResult> Create<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Put, null, cancellationToken);
203 
205  public Task Delete(string route, CancellationToken cancellationToken) => RunRequest<object>(route, null, HttpMethod.Delete, null, cancellationToken);
206 
208  public Task<TResult> Create<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Put, instanceId, cancellationToken);
209 
211  public Task<TResult> Read<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, null, HttpMethod.Get, instanceId, cancellationToken);
212 
214  public Task<TResult> Update<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Post, instanceId, cancellationToken);
215 
217  public Task Delete(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<object>(route, null, HttpMethod.Delete, instanceId, cancellationToken);
218 
220  public Task Delete<TBody>(string route, TBody body, long instanceId, CancellationToken cancellationToken) => RunRequest<object>(route, body, HttpMethod.Delete, instanceId, cancellationToken);
221 
223  public Task<TResult> Delete<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, null, HttpMethod.Delete, instanceId, cancellationToken);
224 
226  public Task<TResult> Create<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), HttpMethod.Put, instanceId, cancellationToken);
227 
229  public Task<TResult> Patch<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), new HttpMethod("PATCH"), instanceId, cancellationToken);
230 
232  public void AddRequestLogger(IRequestLogger requestLogger) => requestLoggers.Add(requestLogger ?? throw new ArgumentNullException(nameof(requestLogger)));
233  }
234 }
Occurs when a response is received that did not deserialize to one of the expected Api...
+ + + +
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
+
void SetRequestHeaders(HttpRequestHeaders headers, long?instanceId=null)
Set HttpRequestHeaders using the ApiHeaders. This initially clears headers
Definition: ApiHeaders.cs:224
+
Occurs when the server returns an unknown response
+
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
+
Occurs when the client makes a request while the server is starting or stopping
+
For sending HTTP requests
Definition: IHttpClient.cs:11
+
readonly List< IRequestLogger > requestLoggers
The IRequestLoggers used by the ApiClient
Definition: ApiClient.cs:45
+
Occurs when the client provides invalid credentials
+
ApiClient(IHttpClient httpClient, Uri url, ApiHeaders apiHeaders)
Construct an ApiClient
Definition: ApiClient.cs:58
+
Occurs when the API version of the client is not compatible with the server&#39;s
+
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 ...
+
For logging HTTP requests and responses
+
Occurs when the client provides invalid credentials
+ +
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
+ +
+ + + + diff --git a/_api_client_factory_8cs.html b/_api_client_factory_8cs.html new file mode 100644 index 0000000000..63656cab57 --- /dev/null +++ b/_api_client_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_api_client_factory_8cs_source.html b/_api_client_factory_8cs_source.html new file mode 100644 index 0000000000..55aacd880e --- /dev/null +++ b/_api_client_factory_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
4 namespace Tgstation.Server.Client
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
+ + + +
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..372b2cb866 --- /dev/null +++ b/_api_conflict_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_api_conflict_exception_8cs_source.html b/_api_conflict_exception_8cs_source.html new file mode 100644 index 0000000000..42aa827bda --- /dev/null +++ b/_api_conflict_exception_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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 }
+ + +
ApiConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode)
Construct an ApiConflictException using an errorMessage
+ +
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..5067a42b2b --- /dev/null +++ b/_api_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Controllers
 
+
+ + + + diff --git a/_api_controller_8cs_source.html b/_api_controller_8cs_source.html new file mode 100644 index 0000000000..960f8373f9 --- /dev/null +++ b/_api_controller_8cs_source.html @@ -0,0 +1,136 @@ + + + + + + +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 
15 namespace Tgstation.Server.Host.Controllers
16 {
20  [Produces(ApiHeaders.ApplicationJson)]
21  [Consumes(ApiHeaders.ApplicationJson)]
22  public abstract class ApiController : Controller
23  {
27  protected ApiHeaders ApiHeaders { get; private set; }
28 
32  protected IDatabaseContext DatabaseContext { get; }
33 
38 
42  protected ILogger Logger { get; }
43 
47  protected Models.Instance Instance { get; }
48 
52  readonly bool requireInstance;
53 
61  public ApiController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
62  {
63  DatabaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
64  if (authenticationContextFactory == null)
65  throw new ArgumentNullException(nameof(authenticationContextFactory));
66  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
67  AuthenticationContext = authenticationContextFactory.CurrentAuthenticationContext;
69  this.requireInstance = requireInstance;
70  }
71 
73  public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
74  {
75  //ALL valid token and login requests that match a route go through this function
76  //404 is returned before
77 
78  if (AuthenticationContext != null && AuthenticationContext.User == null)
79  {
80  //valid token, expired password
81  await Unauthorized().ExecuteResultAsync(context).ConfigureAwait(false);
82  return;
83  }
84 
85  //validate the headers
86  try
87  {
88  ApiHeaders = new ApiHeaders(Request.GetTypedHeaders());
89 
90  if (!ApiHeaders.Compatible())
91  {
92  await StatusCode((int)HttpStatusCode.UpgradeRequired, new ErrorMessage
93  {
94  Message = "Provided API version is incompatible with server version!"
95  }).ExecuteResultAsync(context).ConfigureAwait(false);
96  return;
97  }
98 
99  if (requireInstance)
100  {
101  if (!ApiHeaders.InstanceId.HasValue)
102  {
103  await BadRequest(new ErrorMessage { Message = "Missing Instance header!" }).ExecuteResultAsync(context).ConfigureAwait(false);
104  return;
105  }
107  {
108  //accessing an instance they don't have access to or one that's disabled
109  await Forbid().ExecuteResultAsync(context).ConfigureAwait(false);
110  return;
111  }
112  }
113  }
114  catch (InvalidOperationException e)
115  {
116  await BadRequest(new ErrorMessage { Message = e.Message }).ExecuteResultAsync(context).ConfigureAwait(false);
117  return;
118  }
119 
120  if (ModelState?.IsValid == false)
121  {
122  var errorMessages = ModelState.SelectMany(x => x.Value.Errors).Select(x => x.ErrorMessage).ToList();
123  //HACK
124  //do some fuckery to remove RequiredAttribute errors
125  for (var I = 0; I < errorMessages.Count; ++I)
126  {
127  var message = errorMessages[I];
128  if (message.StartsWith("The ", StringComparison.Ordinal) && message.EndsWith(" field is required.", StringComparison.Ordinal))
129  {
130  errorMessages.RemoveAt(I);
131  --I;
132  }
133  }
134  if (errorMessages.Count > 0)
135  {
136  await BadRequest(new ErrorMessage { Message = String.Join(Environment.NewLine, errorMessages) }).ExecuteResultAsync(context).ConfigureAwait(false);
137  return;
138  }
139  }
140 
141  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.UserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId);
142 
143  try
144  {
145  await base.OnActionExecutionAsync(context, next).ConfigureAwait(false);
146  }
147  catch (OperationCanceledException e)
148  {
149  Logger.LogDebug("Request cancelled! Exception: {0}", e);
150  throw;
151  }
152  }
153  }
154 }
+ + +
ApiController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
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&#39;s API version
Definition: ApiHeaders.cs:71
+
bool Compatible()
Checks if the ApiVersion is compatible with Version
+
Represents the currently authenticated Api.Models.User
+
ProductHeaderValue UserAgent
The client&#39;s user agent
Definition: ApiHeaders.cs:66
+ +
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
+ + + + + +
long Id
The ID of the User
Definition: User.cs:15
+
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
+
long InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
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..2214dc1cda --- /dev/null +++ b/_api_headers_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api
 
+
+ + + + diff --git a/_api_headers_8cs_source.html b/_api_headers_8cs_source.html new file mode 100644 index 0000000000..c1401de739 --- /dev/null +++ b/_api_headers_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 System;
2 using System.Collections.Generic;
3 using System.Globalization;
4 using System.Linq;
5 using System.Net.Http.Headers;
6 using System.Reflection;
7 using Microsoft.AspNetCore.Http.Headers;
8 using Microsoft.Net.Http.Headers;
9 using Microsoft.Extensions.Primitives;
10 
11 namespace Tgstation.Server.Api
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 { get; }
67 
71  public Version ApiVersion { get; }
72 
76  public string Token { get; }
77 
81  public string Username { get; }
82 
86  public string Password { get; }
87 
91  public bool IsTokenAuthentication => Token != null;
92 
98  public static bool CheckCompatibility(Version otherVersion) => !(Version.Major != otherVersion.Major || Version.Minor != otherVersion.Minor || Version.Build > otherVersion.Build);
99 
105  public ApiHeaders(ProductHeaderValue userAgent, string token) : this(userAgent, token, null, null)
106  {
107  if (userAgent == null)
108  throw new ArgumentNullException(nameof(userAgent));
109  if (token == null)
110  throw new ArgumentNullException(nameof(token));
111  }
112 
119  public ApiHeaders(ProductHeaderValue userAgent, string username, string password) : this(userAgent, null, username, password)
120  {
121  if (userAgent == null)
122  throw new ArgumentNullException(nameof(userAgent));
123  if (username == null)
124  throw new ArgumentNullException(nameof(username));
125  if (password == null)
126  throw new ArgumentNullException(nameof(password));
127  }
128 
133  public ApiHeaders(RequestHeaders requestHeaders)
134  {
135  var jsonAccept = new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(ApplicationJson);
136  if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType))
137  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Client does not accept {0}!", ApplicationJson));
138 
139  if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || !ProductInfoHeaderValue.TryParse(userAgentValues.FirstOrDefault(), out var clientUserAgent))
140  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} headers!", HeaderNames.UserAgent));
141 
142  //assure the client user agent has a name and version
143  if (String.IsNullOrWhiteSpace(clientUserAgent.Product.Name) || !Version.TryParse(clientUserAgent.Product.Version, out var clientVersion))
144  throw new InvalidOperationException("Malformed client user agent!");
145 
146  //make sure the api header matches ours
147  if (!requestHeaders.Headers.TryGetValue(ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name != assemblyName.Name)
148  throw new InvalidOperationException("Missing API version!");
149 
150  if (!Version.TryParse(apiUserAgent.Product.Version, out var apiVersion))
151  throw new InvalidOperationException("Malformed API version!");
152 
153  ApiVersion = apiVersion;
154  UserAgent = clientUserAgent.Product;
155 
156  if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization))
157  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} header!", HeaderNames.Authorization));
158  var auth = authorization.First();
159  var splits = new List<string>(auth.Split(' '));
160  var scheme = splits.First();
161  if (String.IsNullOrWhiteSpace(scheme))
162  throw new InvalidOperationException("Missing authentication scheme!");
163 
164  splits.RemoveAt(0);
165  var parameter = String.Concat(splits);
166  if (String.IsNullOrEmpty(parameter))
167  throw new InvalidOperationException("Missing authentication parameter!");
168 
169  if (requestHeaders.Headers.TryGetValue(instanceIdHeader, out var instanceIdValues))
170  {
171  var instanceIdString = instanceIdValues.FirstOrDefault();
172  if (instanceIdString != default && Int64.TryParse(instanceIdString, out var instanceId))
173  InstanceId = instanceId;
174  }
175 
176  switch (scheme)
177  {
178  case jwtAuthenticationScheme:
179  Token = parameter;
180  break;
181  case passwordAuthenticationScheme:
182  Password = parameter;
183  var fail = !requestHeaders.Headers.TryGetValue(usernameHeader, out var values);
184  if (!fail)
185  {
186  Username = values.FirstOrDefault();
187  fail = String.IsNullOrWhiteSpace(Username);
188  }
189  if (fail)
190  throw new InvalidOperationException("Missing Username header!");
191  break;
192  default:
193  throw new InvalidOperationException("Invalid authentication scheme!");
194  }
195  }
196 
204  ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password)
205  {
206  UserAgent = userAgent;
207  Token = token;
208  Username = username;
209  Password = password;
210  ApiVersion = Version;
211  }
212 
217  public bool Compatible() => CheckCompatibility(ApiVersion);
218 
224  public void SetRequestHeaders(HttpRequestHeaders headers, long? instanceId = null)
225  {
226  if (headers == null)
227  throw new ArgumentNullException(nameof(headers));
228  if (instanceId.HasValue && InstanceId.HasValue && instanceId != InstanceId)
229  throw new InvalidOperationException("Specified instance ID in constructor and SetRequestHeaders!");
230 
231  headers.Clear();
232  headers.Accept.Add(new MediaTypeWithQualityHeaderValue(ApplicationJson));
233  if (IsTokenAuthentication)
234  headers.Authorization = new AuthenticationHeaderValue(jwtAuthenticationScheme, Token);
235  else
236  {
237  headers.Authorization = new AuthenticationHeaderValue(passwordAuthenticationScheme, Password);
238  headers.Add(usernameHeader, Username);
239  }
240  headers.UserAgent.Add(new ProductInfoHeaderValue(UserAgent));
241  headers.Add(ApiVersionHeader, new ProductHeaderValue(assemblyName.Name, ApiVersion.ToString()).ToString());
242  instanceId = instanceId ?? InstanceId;
243  if (instanceId.HasValue)
244  headers.Add(instanceIdHeader, instanceId.ToString());
245  }
246  }
247 }
+
void SetRequestHeaders(HttpRequestHeaders headers, long?instanceId=null)
Set HttpRequestHeaders using the ApiHeaders. This initially clears headers
Definition: ApiHeaders.cs:224
+
ApiHeaders(ProductHeaderValue userAgent, string username, string password)
Construct ApiHeaders for password authentication
Definition: ApiHeaders.cs:119
+
ApiHeaders(ProductHeaderValue userAgent, string token)
Construct ApiHeaders for JWT authentication
Definition: ApiHeaders.cs:105
+
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:204
+
ApiHeaders(RequestHeaders requestHeaders)
Construct and validates ApiHeaders from a set of requestHeaders
Definition: ApiHeaders.cs:133
+
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..5c3c5b8edf --- /dev/null +++ b/_api_mismatch_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_api_mismatch_exception_8cs_source.html b/_api_mismatch_exception_8cs_source.html new file mode 100644 index 0000000000..f498deea61 --- /dev/null +++ b/_api_mismatch_exception_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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&#39;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..dc3723f12e --- /dev/null +++ b/_api_validation_status_8cs.html @@ -0,0 +1,129 @@ + + + + + + +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..9ddb06b1fb --- /dev/null +++ b/_api_validation_status_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components.Watchdog
2 {
7  {
32  }
33 }
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.Ultrasafe
+ +
Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity.Safe
+ +
Valid API. The game must be run with a security level of Api.Models.DreamDaemonSecurity.Trusted
+ + +
ApiValidationStatus
Status of DMAPI validation
+
+ + + + diff --git a/_application_8cs.html b/_application_8cs.html new file mode 100644 index 0000000000..c2b46ed08e --- /dev/null +++ b/_application_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_application_8cs_source.html b/_application_8cs_source.html new file mode 100644 index 0000000000..a3c95a5ce6 --- /dev/null +++ b/_application_8cs_source.html @@ -0,0 +1,215 @@ + + + + + + +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.Hosting;
6 using Microsoft.AspNetCore.Identity;
7 using Microsoft.Extensions.Configuration;
8 using Microsoft.Extensions.DependencyInjection;
9 using Microsoft.Extensions.Hosting;
10 using Microsoft.Extensions.Logging;
11 using Microsoft.Extensions.Options;
12 using Microsoft.Extensions.Primitives;
13 using Newtonsoft.Json;
14 using Newtonsoft.Json.Converters;
15 using Serilog;
16 using Serilog.Events;
17 using Serilog.Formatting.Display;
18 using System;
19 using System.Globalization;
20 using System.IdentityModel.Tokens.Jwt;
21 using System.Reflection;
22 using System.Runtime.InteropServices;
23 using System.Threading.Tasks;
30 using Tgstation.Server.Host.IO;
33 
34 namespace Tgstation.Server.Host.Core
35 {
37  sealed class Application : IApplication
38  {
40  public string VersionPrefix => "tgstation-server";
41 
43  public Version Version { get; }
44 
46  public string VersionString { get; }
47 
51  readonly IConfiguration configuration;
52 
56  readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment;
57 
61  readonly TaskCompletionSource<object> startupTcs;
62 
67 
73  public Application(IConfiguration configuration, Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment)
74  {
75  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
76  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
77 
78  startupTcs = new TaskCompletionSource<object>();
79 
80  Version = Assembly.GetExecutingAssembly().GetName().Version;
81  VersionString = String.Format(CultureInfo.InvariantCulture, "{0} v{1}", VersionPrefix, Version);
82  }
83 
88  public void ConfigureServices(IServiceCollection services)
89  {
90  if (services == null)
91  throw new ArgumentNullException(nameof(services));
92 
93  //needful
94  services.AddSingleton<IApplication>(this);
95 
96  //configure configuration
97  services.Configure<UpdatesConfiguration>(configuration.GetSection(UpdatesConfiguration.Section));
98  services.Configure<DatabaseConfiguration>(configuration.GetSection(DatabaseConfiguration.Section));
99  services.Configure<GeneralConfiguration>(configuration.GetSection(GeneralConfiguration.Section));
100  services.Configure<FileLoggingConfiguration>(configuration.GetSection(FileLoggingConfiguration.Section));
101 
102  //enable options which give us config reloading
103  services.AddOptions();
104 
105  //other stuff needed for for setup wizard and configuration
106  services.AddSingleton<IIOManager, DefaultIOManager>();
107  services.AddSingleton<IConsole, IO.Console>();
108  services.AddSingleton<IDBConnectionFactory, DBConnectionFactory>();
109  services.AddSingleton<ISetupWizard, SetupWizard>();
110  services.AddSingleton<IPlatformIdentifier, PlatformIdentifier>();
111  services.AddSingleton<IAsyncDelayer, AsyncDelayer>();
112 
113  GeneralConfiguration generalConfiguration;
114  DatabaseConfiguration databaseConfiguration;
115  FileLoggingConfiguration fileLoggingConfiguration;
116  IIOManager ioManager;
117  IPlatformIdentifier platformIdentifier;
118 
119  //temporarily build the service provider in it's current state
120  //do it here so we can run the setup wizard if necessary
121  //also allows us to get some options and other services we need for continued configuration
122  using (var provider = services.BuildServiceProvider())
123  {
124  //run the wizard if necessary
125  var setupWizard = provider.GetRequiredService<ISetupWizard>();
126  var applicationLifetime = provider.GetRequiredService<Microsoft.AspNetCore.Hosting.IApplicationLifetime>();
127  var setupWizardRan = setupWizard.CheckRunWizard(applicationLifetime.ApplicationStopping).GetAwaiter().GetResult();
128 
129  //load the configuration options we need
130  var generalOptions = provider.GetRequiredService<IOptions<GeneralConfiguration>>();
131  generalConfiguration = generalOptions.Value;
132 
133  //unless this is set, in which case, we leave
134  if (setupWizardRan && generalConfiguration.SetupWizardMode == SetupWizardMode.Only)
135  //we don't inject a logger in the constuctor to log this because it's not yet configured
136  throw new OperationCanceledException("Exiting due to SetupWizardMode configuration!");
137 
138  var dbOptions = provider.GetRequiredService<IOptions<DatabaseConfiguration>>();
139  databaseConfiguration = dbOptions.Value;
140 
141  var loggingOptions = provider.GetRequiredService<IOptions<FileLoggingConfiguration>>();
142  fileLoggingConfiguration = loggingOptions.Value;
143 
144  ioManager = provider.GetRequiredService<IIOManager>();
145  platformIdentifier = provider.GetRequiredService<IPlatformIdentifier>();
146  }
147 
148  //setup file logging via serilog
149  if (!fileLoggingConfiguration.Disable)
150  services.AddLogging(builder =>
151  {
152  //common app data is C:/ProgramData on windows, else /usr/shar
153  var logPath = !String.IsNullOrEmpty(fileLoggingConfiguration.Directory) ? fileLoggingConfiguration.Directory : ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), VersionPrefix, "Logs");
154 
155  logPath = ioManager.ConcatPath(logPath, "tgs-{Date}.log");
156 
157  LogEventLevel? ConvertLogLevel(LogLevel logLevel)
158  {
159  switch (logLevel)
160  {
161  case LogLevel.Critical:
162  return LogEventLevel.Fatal;
163  case LogLevel.Debug:
164  return LogEventLevel.Debug;
165  case LogLevel.Error:
166  return LogEventLevel.Error;
167  case LogLevel.Information:
168  return LogEventLevel.Information;
169  case LogLevel.Trace:
170  return LogEventLevel.Verbose;
171  case LogLevel.Warning:
172  return LogEventLevel.Warning;
173  case LogLevel.None:
174  return null;
175  default:
176  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid log level {0}", logLevel));
177  }
178  };
179 
180  var logEventLevel = ConvertLogLevel(fileLoggingConfiguration.LogLevel);
181  var microsoftEventLevel = ConvertLogLevel(fileLoggingConfiguration.MicrosoftLogLevel);
182 
183  var formatter = new MessageTemplateTextFormatter("{Timestamp:o} {RequestId,13} [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}", null);
184 
185  var configuration = new LoggerConfiguration()
186  .Enrich.FromLogContext()
187  .WriteTo.Async(w => w.RollingFile(formatter, logPath, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(2)));
188 
189  if (logEventLevel.HasValue)
190  configuration.MinimumLevel.Is(logEventLevel.Value);
191 
192  if (microsoftEventLevel.HasValue)
193  configuration.MinimumLevel.Override("Microsoft", microsoftEventLevel.Value);
194 
195  builder.AddSerilog(configuration.CreateLogger(), true);
196  });
197 
198  //configure bearer token validation
199  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(jwtBearerOptions =>
200  {
201  //this line isn't actually run until the first request is made
202  //at that point tokenFactory will be populated
203  jwtBearerOptions.TokenValidationParameters = tokenFactory.ValidationParameters;
204  jwtBearerOptions.Events = new JwtBearerEvents
205  {
206  //Application is our composition root so this monstrosity of a line is okay
207  OnTokenValidated = ctx => ctx.HttpContext.RequestServices.GetRequiredService<IClaimsInjector>().InjectClaimsIntoContext(ctx, ctx.HttpContext.RequestAborted)
208  };
209  });
210  //fucking converts 'sub' to M$ bs
211  //can't be done in the above lambda, that's too late
212  JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
213 
214  //add mvc, configure the json serializer settings
215  services.AddMvc().AddJsonOptions(options =>
216  {
217  options.AllowInputFormatterExceptionMessages = true;
218  options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
219  options.SerializerSettings.CheckAdditionalContent = true;
220  options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
221  options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
222  options.SerializerSettings.Converters = new[] { new VersionConverter() };
223  });
224 
225  void AddTypedContext<TContext>() where TContext : DatabaseContext<TContext>
226  {
227  services.AddDbContext<TContext>(builder =>
228  {
229  if (hostingEnvironment.IsDevelopment())
230  builder.EnableSensitiveDataLogging();
231  });
232  services.AddScoped<IDatabaseContext>(x => x.GetRequiredService<TContext>());
233  }
234 
235  //add the correct database context type
236  var dbType = databaseConfiguration.DatabaseType;
237  switch (dbType)
238  {
239  case DatabaseType.MySql:
240  case DatabaseType.MariaDB:
241  AddTypedContext<MySqlDatabaseContext>();
242  break;
243  case DatabaseType.SqlServer:
244  AddTypedContext<SqlServerDatabaseContext>();
245  break;
246  default:
247  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid {0}: {1}!", nameof(DatabaseType), dbType));
248  }
249 
250  //configure other database services
251  services.AddSingleton<IDatabaseContextFactory, DatabaseContextFactory>();
252  services.AddSingleton<IDatabaseSeeder, DatabaseSeeder>();
253 
254  //configure security services
256  services.AddScoped<IClaimsInjector, ClaimsInjector>();
257  services.AddSingleton<IIdentityCache, IdentityCache>();
258  services.AddSingleton<ICryptographySuite, CryptographySuite>();
259  services.AddSingleton<ITokenFactory, TokenFactory>();
260  services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
261 
262  //configure platform specific services
263  if (platformIdentifier.IsWindows)
264  {
265  services.AddSingleton<ISystemIdentityFactory, WindowsSystemIdentityFactory>();
266  services.AddSingleton<ISymlinkFactory, WindowsSymlinkFactory>();
267  services.AddSingleton<IByondInstaller, WindowsByondInstaller>();
268  services.AddSingleton<IPostWriteHandler, WindowsPostWriteHandler>();
269 
270  services.AddSingleton<WindowsNetworkPromptReaper>();
271  services.AddSingleton<INetworkPromptReaper>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
272  services.AddSingleton<IHostedService>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
273  }
274  else
275  {
276  services.AddSingleton<ISystemIdentityFactory, PosixSystemIdentityFactory>();
277  services.AddSingleton<ISymlinkFactory, PosixSymlinkFactory>();
278  services.AddSingleton<IByondInstaller, PosixByondInstaller>();
279  services.AddSingleton<IPostWriteHandler, PosixPostWriteHandler>();
280  services.AddSingleton<INetworkPromptReaper, PosixNetworkPromptReaper>();
281  }
282 
283  //configure misc services
284  services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
285  services.AddSingleton<IGitHubClientFactory, GitHubClientFactory>();
286  services.AddSingleton<IProcessExecutor, ProcessExecutor>();
287  services.AddSingleton<IByondTopicSender>(new ByondTopicSender
288  {
289  ReceiveTimeout = generalConfiguration.ByondTopicTimeout,
290  SendTimeout = generalConfiguration.ByondTopicTimeout
291  });
292 
293  //configure component services
294  services.AddSingleton<ICredentialsProvider, CredentialsProvider>();
295  services.AddSingleton<IProviderFactory, ProviderFactory>();
296  services.AddSingleton<IChatFactory, ChatFactory>();
297  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
298  services.AddSingleton<IInstanceFactory, InstanceFactory>();
299 
300  //configure root services
301  services.AddSingleton<InstanceManager>();
302  services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
303  services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
304 
305  services.AddSingleton<IJobManager, JobManager>();
306  }
307 
315  public void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, ILogger<Application> logger)
316  {
317  if (applicationBuilder == null)
318  throw new ArgumentNullException(nameof(applicationBuilder));
319  if (serverControl == null)
320  throw new ArgumentNullException(nameof(serverControl));
321 
322  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
323 
324  if (logger == null)
325  throw new ArgumentNullException(nameof(logger));
326 
327  logger.LogInformation(VersionString);
328 
329  //attempt to restart the server if the configuration changes
330  if(serverControl.WatchdogPresent)
331  ChangeToken.OnChange(configuration.GetReloadToken, () => serverControl.Restart());
332 
333  //now setup the HTTP request pipeline
334 
335  //should anything after this throw an exception, catch it and display a detailed html page
336  applicationBuilder.UseDeveloperExceptionPage(); //it is not worth it to limit this, you should only ever get it if you're an authorized user
337 
338  //suppress OperationCancelledExceptions, they are just aborted HTTP requests
339  applicationBuilder.UseCancelledRequestSuppression();
340 
341  //Do not service requests until Ready is called, this will return 503 until that point
342  applicationBuilder.UseAsyncInitialization(async cancellationToken =>
343  {
344  using (cancellationToken.Register(() => startupTcs.SetCanceled()))
345  await startupTcs.Task.ConfigureAwait(false);
346  });
347 
348  //authenticate JWT tokens using our security pipeline if present, returns 401 if bad
349  applicationBuilder.UseAuthentication();
350 
351  //suppress and log database exceptions
352  applicationBuilder.UseDbConflictHandling();
353 
354  //majority of handling is done in the controllers
355  applicationBuilder.UseMvc();
356 
357  //404 anything that gets this far
358  }
359 
361  public void Ready(Exception initializationError)
362  {
363  lock (startupTcs)
364  {
365  if (startupTcs.Task.IsCompleted)
366  throw new InvalidOperationException("Ready has already been called!");
367  if (initializationError == null)
368  startupTcs.SetResult(null);
369  else
370  startupTcs.SetException(initializationError);
371  }
372  }
373  }
374 }
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:56
+
IPostWriteHandler for POSIX systems
+ +
+ + +
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
if live updates are supported, . ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this ...
+ + +
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:66
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+
For initially seeding a database
+ + + + + + + +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+
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:361
+ + +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the UpdatesConfiguration res...
+ + +
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:61
+ + + + + + +
void ConfigureServices(IServiceCollection services)
Configure dependency injected services
Definition: Application.cs:88
+ + +
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:73
+
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
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the FileLoggingConfiguration...
+ +
Task< bool > CheckRunWizard(CancellationToken cancellationToken)
Run the setup wizard if necessary
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, ILogger< Application > logger)
Configure the Application
Definition: Application.cs:315
+
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
+
For identifying the current platform
+ + + +
readonly IConfiguration configuration
The IConfiguration for the Application
Definition: Application.cs:51
+ +
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..ba00539dea --- /dev/null +++ b/_application_builder_extensions_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..0f5c22416d --- /dev/null +++ b/_application_builder_extensions_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
11 namespace Tgstation.Server.Host.Core
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 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..0a2a87fa8a --- /dev/null +++ b/_architecture_8dox.html @@ -0,0 +1,99 @@ + + + + + + +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..a0fde73e33 --- /dev/null +++ b/_async_delayer_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_async_delayer_8cs_source.html b/_async_delayer_8cs_source.html new file mode 100644 index 0000000000..481321cec2 --- /dev/null +++ b/_async_delayer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Core
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..20295d2f8b --- /dev/null +++ b/_authentication_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Security
 
+
+ + + + diff --git a/_authentication_context_8cs_source.html b/_authentication_context_8cs_source.html new file mode 100644 index 0000000000..6374c20d82 --- /dev/null +++ b/_authentication_context_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Security
7 {
12  {
14  public User User { get; }
15 
17  public InstanceUser InstanceUser { get; }
18 
20  public ISystemIdentity SystemIdentity { get; }
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  // use the api versions because they're the ones that contain the actual properties
57  var typeToCheck = isInstance ? typeof(InstanceUser) : typeof(User);
58 
59  var nullableType = typeof(Nullable<>);
60  var nullableRightsType = nullableType.MakeGenericType(rightsEnum);
61 
62  var prop = typeToCheck.GetProperties().Where(x => x.PropertyType == nullableRightsType).First();
63 
64  var right = prop.GetMethod.Invoke(isInstance ? (object)InstanceUser : User, Array.Empty<object>());
65 
66  if (right == null)
67  throw new InvalidOperationException("A user right was null!");
68  return (ulong)right;
69  }
70  }
71 }
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..75db130333 --- /dev/null +++ b/_authentication_context_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/AuthenticationContextFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AuthenticationContextFactory.cs File Reference
+
+ + + + + diff --git a/_authentication_context_factory_8cs_source.html b/_authentication_context_factory_8cs_source.html new file mode 100644 index 0000000000..d8485f7437 --- /dev/null +++ b/_authentication_context_factory_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Security
9 {
12  {
14  public IAuthenticationContext CurrentAuthenticationContext { get; private set; }
15 
20 
25 
30 
37  public AuthenticationContextFactory(ISystemIdentityFactory systemIdentityFactory, IDatabaseContext databaseContext, IIdentityCache identityCache)
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  {
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  systemIdentity = null;
80  }
81 
82  try
83  {
84  var instanceUser = await instanceUserQuery.ConfigureAwait(false);
85 
86  CurrentAuthenticationContext = new AuthenticationContext(systemIdentity, user, instanceUser);
87  }
88  catch
89  {
90  systemIdentity?.Dispose();
91  throw;
92  }
93  }
94  }
95 }
+ + +
AuthenticationContextFactory(ISystemIdentityFactory systemIdentityFactory, IDatabaseContext databaseContext, IIdentityCache identityCache)
Construct an AuthenticationContextFactory
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + +
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
+ +
async Task CreateAuthenticationContext(long userId, long?instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
Create an IAuthenticationContext to populate CurrentAuthenticationContext
+ + + + +
+ + + + diff --git a/_bool_converter_8cs.html b/_bool_converter_8cs.html new file mode 100644 index 0000000000..56a4431a23 --- /dev/null +++ b/_bool_converter_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..b11fbad952 --- /dev/null +++ b/_bool_converter_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Chat.Commands
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
+ + + +
+ + + + diff --git a/_byond_8cs.html b/_byond_8cs.html new file mode 100644 index 0000000000..bf9edcb98f --- /dev/null +++ b/_byond_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Models
 
+
+ + + + diff --git a/_byond_8cs_source.html b/_byond_8cs_source.html new file mode 100644 index 0000000000..3c990821fc --- /dev/null +++ b/_byond_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
4 {
8  public sealed class Byond
9  {
13  public Version Version { get; set; }
14 
18  public Job InstallJob { get; set; }
19  }
20 }
+ +
Represents a BYOND installation
Definition: Byond.cs:8
+ +
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..eeaa24598f --- /dev/null +++ b/_byond_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ByondClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondClient.cs File Reference
+
+ + + + + diff --git a/_byond_client_8cs_source.html b/_byond_client_8cs_source.html new file mode 100644 index 0000000000..6103aacb4f --- /dev/null +++ b/_byond_client_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client.Components
9 {
11  sealed class ByondClient : IByondClient
12  {
20  readonly Instance instance;
21 
27  public ByondClient(IApiClient apiClient, Instance instance)
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
32 
34  public Task<Byond> ActiveVersion(CancellationToken cancellationToken) => apiClient.Read<Byond>(Routes.Byond, instance.Id, cancellationToken);
35 
37  public Task<IReadOnlyList<Byond>> InstalledVersions(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Byond>>(Routes.List(Routes.Byond), instance.Id, cancellationToken);
38 
40  public Task<Byond> SetActiveVersion(Byond byond, CancellationToken cancellationToken) => apiClient.Update<Byond, Byond>(Routes.Byond, byond ?? throw new ArgumentNullException(nameof(byond)), instance.Id, cancellationToken);
41  }
42 }
const string Byond
The Models.Byond controller
Definition: Routes.cs:34
+ + +
For managing the Byond installation
Definition: IByondClient.cs:11
+ +
ByondClient(IApiClient apiClient, Instance instance)
Construct a ByondClient
Definition: ByondClient.cs:27
+
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:20
+ +
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
+ +
+ + + + diff --git a/_byond_command_8cs.html b/_byond_command_8cs.html new file mode 100644 index 0000000000..13517d1bd7 --- /dev/null +++ b/_byond_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..1bc3a7f53c --- /dev/null +++ b/_byond_command_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Components.Chat.Commands
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 
40  public ByondCommand(IByondManager byondManager, IWatchdog watchdog)
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
+ +
For managing the BYOND installation
+
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
+ +
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..9e21cba37c --- /dev/null +++ b/_byond_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ByondController.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondController.cs File Reference
+
+ + + + + diff --git a/_byond_controller_8cs_source.html b/_byond_controller_8cs_source.html new file mode 100644 index 0000000000..c2522b73ff --- /dev/null +++ b/_byond_controller_8cs_source.html @@ -0,0 +1,138 @@ + + + + + + +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 
16 namespace Tgstation.Server.Host.Controllers
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 
74  var byondManager = instanceManager.GetInstance(Instance).ByondManager;
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  //run the install through the job manager
90  var job = new Models.Job
91  {
92  Description = String.Format(CultureInfo.InvariantCulture, "Install BYOND version {0}", installingVersion),
93  StartedBy = AuthenticationContext.User,
94  CancelRightsType = RightsType.Byond,
95  CancelRight = (ulong)ByondRights.CancelInstall,
97  };
98  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => byondManager.ChangeVersion(installingVersion, ct), cancellationToken).ConfigureAwait(false);
99  result.InstallJob = job.ToApi();
100  }
101  if ((AuthenticationContext.GetRight(RightsType.Byond) & (ulong)ByondRights.ReadActive) != 0)
102  result.Version = byondManager.ActiveVersion;
103  return result.InstallJob != null ? (IActionResult)Accepted(result) : Json(result);
104  }
105  }
106 }
+
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
+ + + + + +
Controller for managing Api.Models.Byond.Versions
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
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
+ + +
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
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..9f420d8eec --- /dev/null +++ b/_byond_executable_lock_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/ByondExecutableLock.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondExecutableLock.cs File Reference
+
+ + + + + diff --git a/_byond_executable_lock_8cs_source.html b/_byond_executable_lock_8cs_source.html new file mode 100644 index 0000000000..93df1cb913 --- /dev/null +++ b/_byond_executable_lock_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Byond
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 werent 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..a009a2d0b8 --- /dev/null +++ b/_byond_manager_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/ByondManager.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondManager.cs File Reference
+
+ + + + + diff --git a/_byond_manager_8cs_source.html b/_byond_manager_8cs_source.html new file mode 100644 index 0000000000..214ad8ce16 --- /dev/null +++ b/_byond_manager_8cs_source.html @@ -0,0 +1,133 @@ + + + + + + +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 
13 namespace Tgstation.Server.Host.Components.Byond
14 {
16  sealed class ByondManager : IByondManager
17  {
21  public const string BinPath = "byond/bin";
22 
26  const string VersionFileName = "Version.txt";
30  const string ActiveVersionFileName = "ActiveVersion.txt";
31 
33  public Version ActiveVersion { get; private set; }
34 
36  public IReadOnlyList<Version> InstalledVersions
37  {
38  get
39  {
40  lock (installedVersions)
41  return installedVersions.Select(x => Version.Parse(x.Key)).ToList();
42  }
43  }
44 
49 
54 
59 
63  readonly ILogger<ByondManager> logger;
64 
68  readonly Dictionary<string, Task> installedVersions;
69 
73  readonly SemaphoreSlim semaphore;
74 
80  static string VersionKey(Version version) => new Version(version.Major, version.Minor).ToString();
81 
89  public ByondManager(IIOManager ioManager, IByondInstaller byondInstaller, IEventConsumer eventConsumer, ILogger<ByondManager> logger)
90  {
91  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
92  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
93  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
94  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
95 
96  installedVersions = new Dictionary<string, Task>();
97  semaphore = new SemaphoreSlim(1);
98  }
99 
101  public void Dispose() => semaphore.Dispose();
102 
109  async Task InstallVersion(Version version, CancellationToken cancellationToken)
110  {
111  var ourTcs = new TaskCompletionSource<object>();
112  Task inProgressTask;
113 
114  var versionKey = VersionKey(version);
115  bool installed;
116  lock (installedVersions)
117  {
118  installed = installedVersions.TryGetValue(versionKey, out inProgressTask);
119  if (!installed)
120  installedVersions.Add(versionKey, ourTcs.Task);
121  }
122  if (installed)
123  using (cancellationToken.Register(() => ourTcs.SetCanceled()))
124  {
125  await Task.WhenAny(ourTcs.Task, inProgressTask).ConfigureAwait(false);
126  cancellationToken.ThrowIfCancellationRequested();
127  return;
128  }
129  //okay up to us to install it then
130  try
131  {
132  await eventConsumer.HandleEvent(EventType.ByondInstallStart, new List<string> { versionKey }, cancellationToken).ConfigureAwait(false);
133  var downloadTask = byondInstaller.DownloadVersion(version, cancellationToken);
134 
135  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
136  await ioManager.CreateDirectory(versionKey, cancellationToken).ConfigureAwait(false);
137 
138  try
139  {
140  var download = await downloadTask.ConfigureAwait(false);
141  await ioManager.ZipToDirectory(versionKey, download, cancellationToken).ConfigureAwait(false);
142  await byondInstaller.InstallByond(ioManager.ResolvePath(versionKey), version, cancellationToken).ConfigureAwait(false);
143 
144  //make sure to do this last because this is what tells us we have a valid version in the future
145  await ioManager.WriteAllBytes(ioManager.ConcatPath(versionKey, VersionFileName), Encoding.UTF8.GetBytes(version.ToString()), cancellationToken).ConfigureAwait(false);
146  }
147  catch (WebException e)
148  {
149  //since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
150  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Error downloading BYOND version: {0}", e.Message));
151  }
152  catch (OperationCanceledException)
153  {
154  throw;
155  }
156  catch
157  {
158  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
159  throw;
160  }
161 
162  ourTcs.SetResult(null);
163  }
164  catch (Exception e)
165  {
166  if (!(e is OperationCanceledException))
167  await eventConsumer.HandleEvent(EventType.ByondInstallFail, new List<string> { e.Message }, cancellationToken).ConfigureAwait(false);
168  lock (installedVersions)
169  installedVersions.Remove(versionKey);
170  ourTcs.SetException(e);
171  throw;
172  }
173  }
174 
176  public async Task ChangeVersion(Version version, CancellationToken cancellationToken)
177  {
178  if (version == null)
179  throw new ArgumentNullException(nameof(version));
180  var versionKey = VersionKey(version);
181  await InstallVersion(version, cancellationToken).ConfigureAwait(false);
182  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
183  {
184  await ioManager.WriteAllBytes(ActiveVersionFileName, Encoding.UTF8.GetBytes(versionKey), cancellationToken).ConfigureAwait(false);
185  await eventConsumer.HandleEvent(EventType.ByondActiveVersionChange, new List<string> { ActiveVersion != null ? VersionKey(ActiveVersion) : null, versionKey }, cancellationToken).ConfigureAwait(false);
186  ActiveVersion = version;
187  }
188  }
189 
191  public async Task<IByondExecutableLock> UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
192  {
193  var versionToUse = requiredVersion ?? ActiveVersion;
194  if (versionToUse == null)
195  throw new JobException("No BYOND versions installed!");
196  await InstallVersion(versionToUse, cancellationToken).ConfigureAwait(false);
197 
198  var versionKey = VersionKey(versionToUse);
199 
200  return new ByondExecutableLock(versionToUse, ioManager.ResolvePath(ioManager.ConcatPath(versionKey, BinPath, byondInstaller.DreamDaemonName)), ioManager.ResolvePath(ioManager.ConcatPath(versionKey, BinPath, byondInstaller.DreamMakerName)));
201  }
202 
204  public async Task StartAsync(CancellationToken cancellationToken)
205  {
206  async Task<byte[]> GetActiveVersion()
207  {
208  if (!await ioManager.FileExists(ActiveVersionFileName, cancellationToken).ConfigureAwait(false))
209  return null;
210  return await ioManager.ReadAllBytes(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
211  }
212 
213  var activeVersionBytesTask = GetActiveVersion();
214 
215  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
216  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
217 
218  async Task ReadVersion(string path)
219  {
220  var versionFile = ioManager.ConcatPath(path, VersionFileName);
221  if (!await ioManager.FileExists(versionFile, cancellationToken).ConfigureAwait(false))
222  {
223  logger.LogInformation("Cleaning unparsable version path: {0}", ioManager.ResolvePath(path));
224  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false); //cleanup
225  return;
226  }
227  var bytes = await ioManager.ReadAllBytes(versionFile, cancellationToken).ConfigureAwait(false);
228  var text = Encoding.UTF8.GetString(bytes);
229  if (Version.TryParse(text, out var version))
230  {
231  var key = VersionKey(version);
232  lock (installedVersions)
233  if (!installedVersions.ContainsKey(key))
234  {
235  installedVersions.Add(key, Task.CompletedTask);
236  return;
237  }
238  }
239  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false);
240  };
241 
242  await Task.WhenAll(directories.Select(x => ReadVersion(x))).ConfigureAwait(false);
243 
244  var activeVersionBytes = await activeVersionBytesTask.ConfigureAwait(false);
245  if (activeVersionBytes != null)
246  {
247  var activeVersionString = Encoding.UTF8.GetString(activeVersionBytes);
248  if (Version.TryParse(activeVersionString, out var activeVersion))
249  ActiveVersion = activeVersion;
250  else
251  await ioManager.DeleteFile(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
252  }
253  }
254 
256  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
257  }
258 }
+
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:48
+
Consumes EventTypes and takes the appropriate actions
+ + +
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
async Task StartAsync(CancellationToken cancellationToken)
+ +
async Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation&#39;s location and return a IByondExecutableLock
+ +
For downloading and installing BYOND extractions for a given system
+
async Task InstallVersion(Version version, CancellationToken cancellationToken)
Installs a BYOND version if it isn&#39;t already
+
For managing the BYOND installation
+
readonly Dictionary< string, Task > installedVersions
Map of byond Versions to Tasks that complete when they are installed
Definition: ByondManager.cs:68
+
ByondManager(IIOManager ioManager, IByondInstaller byondInstaller, IEventConsumer eventConsumer, ILogger< ByondManager > logger)
Construct a ByondManager
Definition: ByondManager.cs:89
+
readonly ILogger< ByondManager > logger
The ILogger for the ByondManager
Definition: ByondManager.cs:63
+ +
async Task ChangeVersion(Version version, CancellationToken cancellationToken)
Change the active BYOND version
+ + +
readonly IByondInstaller byondInstaller
The IByondInstaller for the ByondManager
Definition: ByondManager.cs:53
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the ByondManager
Definition: ByondManager.cs:73
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
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:58
+ + + +
+ + + + diff --git a/_byond_rights_8cs.html b/_byond_rights_8cs.html new file mode 100644 index 0000000000..f45ead4a64 --- /dev/null +++ b/_byond_rights_8cs.html @@ -0,0 +1,128 @@ + + + + + + +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..9fa07a00b3 --- /dev/null +++ b/_byond_rights_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum ByondRights : ulong
10  {
14  None = 0,
18  ReadActive = 1,
22  ListInstalled = 2,
26  ChangeVersion = 4,
30  CancelInstall = 8
31  }
32 }
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..ab1ffc4fe6 --- /dev/null +++ b/_byond_test_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/ByondTest.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondTest.cs File Reference
+
+ + + + + diff --git a/_byond_test_8cs_source.html b/_byond_test_8cs_source.html new file mode 100644 index 0000000000..1f2bf9c4b8 --- /dev/null +++ b/_byond_test_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
7 namespace Tgstation.Server.Tests.Instance
8 {
9  sealed class ByondTest
10  {
13 
14  public ByondTest(IByondClient byondClient, IJobsClient jobsClient)
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
+ + + +
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
+ +
async Task Run(CancellationToken cancellationToken)
Definition: ByondTest.cs:20
+ +
+ + + + diff --git a/_channel_8cs.html b/_channel_8cs.html new file mode 100644 index 0000000000..29472b720f --- /dev/null +++ b/_channel_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Channel.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Channel.cs File Reference
+
+ + + + + diff --git a/_channel_8cs_source.html b/_channel_8cs_source.html new file mode 100644 index 0000000000..6ae63395fc --- /dev/null +++ b/_channel_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Chat
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 IsAdmin { get; set; }
42 
46  public bool IsPrivate { get; set; }
47 
51  public string Tag { get; set; }
52  }
53 }
+ +
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+ + +
+ + + + diff --git a/_channel_mapping_8cs.html b/_channel_mapping_8cs.html new file mode 100644 index 0000000000..84589bc547 --- /dev/null +++ b/_channel_mapping_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_channel_mapping_8cs_source.html b/_channel_mapping_8cs_source.html new file mode 100644 index 0000000000..ecc72901c9 --- /dev/null +++ b/_channel_mapping_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components.Chat
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 }
Represents a mapping of a Channel.RealId
+ +
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+ +
+ + + + diff --git a/_chat_8cs.html b/_chat_8cs.html new file mode 100644 index 0000000000..ac7ba25062 --- /dev/null +++ b/_chat_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Chat.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Chat.cs File Reference
+
+ + + + + diff --git a/_chat_8cs_source.html b/_chat_8cs_source.html new file mode 100644 index 0000000000..6af5373869 --- /dev/null +++ b/_chat_8cs_source.html @@ -0,0 +1,185 @@ + + + + + + +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 
15 namespace Tgstation.Server.Host.Components.Chat
16 {
18  sealed class Chat : IChat, IRestartHandler
19  {
20  const string CommonMention = "!tgs";
21 
26 
31 
36 
41 
46 
50  readonly ILoggerFactory loggerFactory;
51 
55  readonly ILogger<Chat> logger;
56 
60  readonly Dictionary<string, ICommand> builtinCommands;
61 
65  readonly Dictionary<long, IProvider> providers;
66 
70  readonly Dictionary<ulong, ChannelMapping> mappedChannels;
71 
75  readonly List<IJsonTrackingContext> trackingContexts;
76 
80  readonly CancellationTokenSource handlerCts;
81 
85  readonly List<Models.ChatBot> initialChatBots;
86 
91 
96 
100  TaskCompletionSource<object> connectionsUpdated;
101 
106 
110  bool started;
111 
123  public Chat(IProviderFactory providerFactory, IIOManager ioManager, ICommandFactory commandFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory, ILogger<Chat> logger, IEnumerable<Models.ChatBot> initialChatBots)
124  {
125  this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
126  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
127  this.commandFactory = commandFactory ?? throw new ArgumentNullException(nameof(commandFactory));
128  if (serverControl == null)
129  throw new ArgumentNullException(nameof(serverControl));
130  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
131  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
132  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
133  this.initialChatBots = initialChatBots?.ToList() ?? throw new ArgumentNullException(nameof(initialChatBots));
134 
135  restartRegistration = serverControl.RegisterForRestart(this);
136 
137  builtinCommands = new Dictionary<string, ICommand>();
138  providers = new Dictionary<long, IProvider>();
139  mappedChannels = new Dictionary<ulong, ChannelMapping>();
140  trackingContexts = new List<IJsonTrackingContext>();
141  handlerCts = new CancellationTokenSource();
142  connectionsUpdated = new TaskCompletionSource<object>();
143  channelIdCounter = 1;
144  }
145 
147  public void Dispose()
148  {
149  restartRegistration.Dispose();
150  handlerCts.Dispose();
151  foreach (var I in providers)
152  I.Value.Dispose();
153  }
154 
162  async Task<IProvider> RemoveProvider(long connectionId, bool updateTrackings, CancellationToken cancellationToken)
163  {
164  IProvider provider;
165  lock (providers)
166  if (!providers.TryGetValue(connectionId, out provider))
167  return null;
168  Task task;
169  lock (mappedChannels)
170  {
171  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == connectionId).Select(x => x.Key).ToList())
172  mappedChannels.Remove(I);
173 
174  if (updateTrackings)
175  lock (trackingContexts)
176  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
177  else
178  task = Task.CompletedTask;
179  }
180  await task.ConfigureAwait(false);
181  return provider;
182  }
183 
191  async Task ProcessMessage(IProvider provider, Message message, CancellationToken cancellationToken)
192  {
193  //map the channel if it's private and we haven't seen it
194  lock (providers)
195  {
196  var providerId = providers.Where(x => x.Value == provider).Select(x => x.Key).First();
197  var enumerable = mappedChannels.Where(x => x.Value.ProviderId == providerId && x.Value.ProviderChannelId == message.User.Channel.RealId);
198  if (message.User.Channel.IsPrivate)
199  lock (mappedChannels)
200  {
201  if (!provider.Connected)
202  return;
203  if (!enumerable.Any())
204  {
205  ulong newId;
206  lock (this)
207  newId = channelIdCounter++;
208  mappedChannels.Add(newId, new ChannelMapping
209  {
210  IsWatchdogChannel = false,
211  ProviderChannelId = message.User.Channel.RealId,
212  ProviderId = providerId,
213  Channel = message.User.Channel
214  });
215  message.User.Channel.RealId = newId;
216  }
217  else
218  message.User.Channel.RealId = enumerable.First().Key;
219  }
220  else
221  {
222  //need to add tag and isAdminChannel
223  var mapping = enumerable.First().Value;
224  message.User.Channel.Id = mapping.Channel.Id;
225  message.User.Channel.Tag = mapping.Channel.Tag;
226  message.User.Channel.IsAdmin = mapping.Channel.IsAdmin;
227  }
228  }
229 
230  var splits = new List<string>(message.Content.Trim().Split(' '));
231  var address = splits[0];
232  if (address.Length > 1 && (address[address.Length - 1] == ':' || address[address.Length - 1] == ','))
233  address = address.Substring(0, address.Length - 1);
234 
235  address = address.ToUpperInvariant();
236 
237  var addressed = address == CommonMention.ToUpperInvariant() || address == provider.BotMention.ToUpperInvariant();
238 
239  if (!addressed && !message.User.Channel.IsPrivate)
240  //no mention
241  return;
242 
243  logger.LogTrace("Chat command: {0}. User (True provider Id): {1}", message.Content, JsonConvert.SerializeObject(message.User));
244 
245  if (addressed)
246  splits.RemoveAt(0);
247 
248  if (splits.Count == 0)
249  {
250  //just a mention
251  await SendMessage("Hi!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
252  return;
253  }
254 
255  var command = splits[0].ToUpperInvariant();
256  splits.RemoveAt(0);
257  var arguments = String.Join(" ", splits);
258 
259  try
260  {
261  async Task<ICommand> GetCommand(string commandName)
262  {
263  if (!builtinCommands.TryGetValue(commandName, out var handler))
264  {
265  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken));
266  await Task.WhenAll(tasks).ConfigureAwait(false);
267  handler = tasks.SelectMany(x => x.Result).Where(x => x.Name.ToUpperInvariant() == commandName).FirstOrDefault();
268  }
269  return handler;
270  };
271 
272  const string UnknownCommandMessage = "Unknown command! Type '?' or 'help' for available commands.";
273 
274  if (command == "HELP" || command == "?")
275  {
276  string helpText;
277  if (splits.Count == 0)
278  {
279  var allCommands = builtinCommands.Select(x => x.Value).ToList();
280  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken)).ToList();
281  await Task.WhenAll(tasks).ConfigureAwait(false);
282  allCommands.AddRange(tasks.SelectMany(x => x.Result));
283  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)));
284  }
285  else
286  {
287  var helpHandler = await GetCommand(splits[0].ToUpperInvariant()).ConfigureAwait(false);
288  if (helpHandler != default)
289  helpText = String.Format(CultureInfo.InvariantCulture, "{0}: {1}{2}", helpHandler.Name, helpHandler.HelpText, helpHandler.AdminOnly ? " - May only be used in admin channels" : String.Empty);
290  else
291  helpText = UnknownCommandMessage;
292  }
293  await SendMessage(helpText, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
294  return;
295  }
296 
297  var commandHandler = await GetCommand(command).ConfigureAwait(false);
298 
299  if (commandHandler == default)
300  {
301  await SendMessage(UnknownCommandMessage, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
302  return;
303  }
304 
305  if (commandHandler.AdminOnly && !message.User.Channel.IsAdmin)
306  {
307  await SendMessage("Use this command in an admin channel!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
308  return;
309  }
310 
311  var result = await commandHandler.Invoke(arguments, message.User, cancellationToken).ConfigureAwait(false);
312  if (result != null)
313  await SendMessage(result, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
314  }
315  catch (OperationCanceledException)
316  {
317  throw;
318  }
319  catch (Exception e)
320  {
321  //error bc custom commands should reply about why it failed
322  logger.LogError("Error processing chat command: {0}", e);
323  await SendMessage("Internal error processing command!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
324  }
325  }
326 
332  async Task MonitorMessages(CancellationToken cancellationToken)
333  {
334  var messageTasks = new Dictionary<IProvider, Task<Message>>();
335  try
336  {
337  while (!cancellationToken.IsCancellationRequested)
338  {
339  //prune disconnected providers
340  foreach (var I in messageTasks.Where(x => !x.Key.Connected).ToList())
341  messageTasks.Remove(I.Key);
342 
343  //add new ones
344  Task updatedTask;
345  lock (this)
346  updatedTask = connectionsUpdated.Task;
347  lock (providers)
348  foreach (var I in providers)
349  if (I.Value.Connected && !messageTasks.ContainsKey(I.Value))
350  messageTasks.Add(I.Value, I.Value.NextMessage(cancellationToken));
351 
352  if (messageTasks.Count == 0)
353  {
354  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
355  continue;
356  }
357 
358  //wait for a message
359  await Task.WhenAny(updatedTask, Task.WhenAny(messageTasks.Select(x => x.Value))).ConfigureAwait(false);
360 
361  //process completed ones
362  foreach (var I in messageTasks.Where(x => x.Value.IsCompleted).ToList())
363  {
364  var message = await I.Value.ConfigureAwait(false);
365 
366  await ProcessMessage(I.Key, message, cancellationToken).ConfigureAwait(false);
367 
368  messageTasks.Remove(I.Key);
369  }
370  }
371  }
372  catch (OperationCanceledException) { }
373  catch (Exception e)
374  {
375  logger.LogError("Message monitor crashed!: Exception: {0}", e);
376  }
377  }
378 
380  public async Task ChangeChannels(long connectionId, IEnumerable<Api.Models.ChatChannel> newChannels, CancellationToken cancellationToken)
381  {
382  if (newChannels == null)
383  throw new ArgumentNullException(nameof(newChannels));
384  var provider = await RemoveProvider(connectionId, false, cancellationToken).ConfigureAwait(false);
385  if (provider == null)
386  return;
387  var results = await provider.MapChannels(newChannels, cancellationToken).ConfigureAwait(false);
388  if (results == null) //aborted
389  return;
390  var mappings = Enumerable.Zip(newChannels, results, (x, y) => new ChannelMapping
391  {
392  IsWatchdogChannel = x.IsWatchdogChannel == true,
393  IsUpdatesChannel = x.IsUpdatesChannel == true,
394  ProviderChannelId = y.RealId,
395  ProviderId = connectionId,
396  Channel = y
397  });
398 
399  ulong baseId;
400  lock (this)
401  {
402  baseId = channelIdCounter;
403  channelIdCounter += (ulong)results.Count;
404  }
405 
406  Task task;
407  lock (mappedChannels)
408  {
409  lock (providers)
410  if (!providers.TryGetValue(connectionId, out IProvider verify) || verify != provider) //aborted again
411  return;
412  foreach (var I in mappings)
413  {
414  var newId = baseId++;
415  mappedChannels.Add(newId, I);
416  I.Channel.RealId = newId;
417  }
418 
419  lock (trackingContexts)
420  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
421  }
422  await task.ConfigureAwait(false);
423  }
424 
426  public async Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)
427  {
428  if (newSettings == null)
429  throw new ArgumentNullException(nameof(newSettings));
430  IProvider provider;
431 
432  async Task DisconnectProvider(IProvider p)
433  {
434  try
435  {
436  await p.Disconnect(cancellationToken).ConfigureAwait(false);
437  }
438  finally
439  {
440  p.Dispose();
441  }
442  }
443 
444  Task disconnectTask;
445  lock (providers)
446  {
447  //raw settings changes forces a rebuild of the provider
448  if (providers.TryGetValue(newSettings.Id, out provider))
449  {
450  providers.Remove(newSettings.Id);
451  disconnectTask = DisconnectProvider(provider);
452  }
453  else
454  disconnectTask = Task.CompletedTask;
455  if (newSettings.Enabled.Value)
456  {
457  provider = providerFactory.CreateProvider(newSettings);
458  providers.Add(newSettings.Id, provider);
459  }
460  }
461 
462  lock (mappedChannels)
463  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == newSettings.Id).Select(x => x.Key).ToList())
464  mappedChannels.Remove(I);
465 
466  await disconnectTask.ConfigureAwait(false);
467 
468  if (started)
469  {
470  if (newSettings.Enabled.Value)
471  await provider.Connect(cancellationToken).ConfigureAwait(false);
472  lock (this)
473  {
474  //same thread shennanigans
475  var oldOne = connectionsUpdated;
476  connectionsUpdated = new TaskCompletionSource<object>();
477  oldOne.SetResult(null);
478  }
479  }
480  }
481 
483  public Task SendMessage(string message, IEnumerable<ulong> channelIds, CancellationToken cancellationToken)
484  {
485  if (message == null)
486  throw new ArgumentNullException(nameof(message));
487  if (channelIds == null)
488  throw new ArgumentNullException(nameof(channelIds));
489 
490  return Task.WhenAll(channelIds.Select(x =>
491  {
492  ChannelMapping channelMapping;
493  lock (mappedChannels)
494  if (!mappedChannels.TryGetValue(x, out channelMapping))
495  return Task.CompletedTask;
496  IProvider provider;
497  lock (providers)
498  if (!providers.TryGetValue(channelMapping.ProviderId, out provider))
499  return Task.CompletedTask;
500  return provider.SendMessage(channelMapping.ProviderChannelId, message, cancellationToken);
501  }));
502  }
503 
505  public Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
506  {
507  List<ulong> wdChannels;
508  message = String.Format(CultureInfo.InvariantCulture, "WD: {0}", message);
509  lock (mappedChannels) //so it doesn't change while we're using it
510  wdChannels = mappedChannels.Where(x => x.Value.IsWatchdogChannel).Select(x => x.Key).ToList();
511  return SendMessage(message, wdChannels, cancellationToken);
512  }
513 
515  public Task SendUpdateMessage(string message, CancellationToken cancellationToken)
516  {
517  List<ulong> wdChannels;
518  message = String.Format(CultureInfo.InvariantCulture, "DM: {0}", message);
519  lock (mappedChannels) //so it doesn't change while we're using it
520  wdChannels = mappedChannels.Where(x => x.Value.IsUpdatesChannel).Select(x => x.Key).ToList();
521  return SendMessage(message, wdChannels, cancellationToken);
522  }
523 
525  public async Task StartAsync(CancellationToken cancellationToken)
526  {
527  foreach (var I in commandFactory.GenerateCommands())
528  builtinCommands.Add(I.Name.ToUpperInvariant(), I);
529  await Task.WhenAll(initialChatBots.Select(x => ChangeSettings(x, cancellationToken))).ConfigureAwait(false);
530  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Connect(cancellationToken))).ConfigureAwait(false);
531  await Task.WhenAll(initialChatBots.Select(x => ChangeChannels(x.Id, x.Channels, cancellationToken))).ConfigureAwait(false);
532  chatHandler = MonitorMessages(handlerCts.Token);
533  started = true;
534  }
535 
537  public async Task StopAsync(CancellationToken cancellationToken)
538  {
539  handlerCts.Cancel();
540  await chatHandler.ConfigureAwait(false);
541  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Disconnect(cancellationToken))).ConfigureAwait(false);
542  }
543 
545  public async Task<IJsonTrackingContext> TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
546  {
547  if (customCommandHandler == null)
548  throw new InvalidOperationException("RegisterCommandHandler() hasn't been called!");
549  JsonTrackingContext context = null;
550  context = new JsonTrackingContext(ioManager, customCommandHandler, loggerFactory.CreateLogger<JsonTrackingContext>(), () =>
551  {
552  lock (trackingContexts)
553  trackingContexts.Remove(context);
554  }, ioManager.ConcatPath(basePath, commandsJsonName), ioManager.ConcatPath(basePath, channelsJsonName));
555  Task task;
556  lock (trackingContexts)
557  {
558  trackingContexts.Add(context);
559  lock (mappedChannels)
560  task = context.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken);
561  }
562  await task.ConfigureAwait(false);
563  return context;
564  }
565 
567  public bool Connected(long connectionId)
568  {
569  lock (providers)
570  return providers.TryGetValue(connectionId, out var provider) && provider.Connected;
571  }
572 
574  public void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
575  {
576  if (this.customCommandHandler != null)
577  throw new InvalidOperationException("RegisterCommandHandler() already called!");
578  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
579  }
580 
582  public async Task DeleteConnection(long connectionId, CancellationToken cancellationToken)
583  {
584  var provider = await RemoveProvider(connectionId, true, cancellationToken).ConfigureAwait(false);
585  if (provider != null)
586  try
587  {
588  await provider.Disconnect(cancellationToken).ConfigureAwait(false);
589  }
590  finally
591  {
592  provider.Dispose();
593  }
594  }
595 
597  public Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
598  {
599  var message = updateVersion == null ? "TGS: Restart requested..." : String.Format(CultureInfo.InvariantCulture, "TGS: Updating to version {0}...", updateVersion);
600  List<ulong> wdChannels;
601  lock (mappedChannels) //so it doesn't change while we're using it
602  wdChannels = mappedChannels.Select(x => x.Key).ToList();
603  return SendMessage(message, wdChannels, cancellationToken);
604  }
605  }
606 }
void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
Registers a customCommandHandler to use
Definition: Chat.cs:574
+
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:50
+
bool IsPrivate
If this is a 1-to-1 chat channel
Definition: Channel.cs:46
+ + +
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:505
+
bool started
If StartAsync(CancellationToken) has been called
Definition: Chat.cs:110
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
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:85
+
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:123
+
For interacting with a chat service
Definition: IProvider.cs:11
+ + +
Manage the server chat bots
Definition: ChatBot.cs:10
+ + +
bool Connected(long connectionId)
If a given set of ChatBot is connected
Definition: Chat.cs:567
+
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:582
+ + +
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:162
+ +
readonly IProviderFactory providerFactory
The IProviderFactory for the Chat
Definition: Chat.cs:25
+ +
TaskCompletionSource< object > connectionsUpdated
The TaskCompletionSource<TResult> that completes when ChatBots change
Definition: Chat.cs:100
+
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:55
+ +
readonly ICommandFactory commandFactory
The ICommandFactory for the Chat
Definition: Chat.cs:35
+
Task SendUpdateMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured update channels
Definition: Chat.cs:515
+ +
async Task ProcessMessage(IProvider provider, Message message, CancellationToken cancellationToken)
Processes a message
Definition: Chat.cs:191
+
async Task StopAsync(CancellationToken cancellationToken)
Definition: Chat.cs:537
+
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:332
+ +
bool IsAdmin
If this is considered a channel for admin commands
Definition: Channel.cs:41
+ +
readonly IIOManager ioManager
The IIOManager for the Chat
Definition: Chat.cs:30
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
string BotMention
The string that indicates the IProvider was mentioned
Definition: IProvider.cs:21
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:105
+
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:426
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Chat
Definition: Chat.cs:45
+
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: Chat.cs:525
+ +
Task chatHandler
The Task that monitors incoming chat messages
Definition: Chat.cs:95
+
readonly Dictionary< string, ICommand > builtinCommands
Unchanging ICommands in the Chat mapped by ICommand.Name
Definition: Chat.cs:60
+
async Task< IJsonTrackingContext > TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
Start tracking json files for commands and channels
Definition: Chat.cs:545
+
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:483
+
Represents the lifetime of a IRestartHandler registration
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:75
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+
bool Enabled
If the connection is enabled
Definition: ChatBot.cs:26
+ +
async Task ChangeChannels(long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)
Change chat channels
Definition: Chat.cs:380
+
ICustomCommandHandler customCommandHandler
The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>, CancellationToken)
Definition: Chat.cs:90
+
Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
Handle a restart of the server
Definition: Chat.cs:597
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Chat
Definition: Chat.cs:40
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:80
+ +
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..c91f0787ea --- /dev/null +++ b/_chat_bot_rights_8cs.html @@ -0,0 +1,134 @@ + + + + + + +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..62ea8fde09 --- /dev/null +++ b/_chat_bot_rights_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum ChatBotRights : ulong
10  {
14  None = 0,
18  WriteEnabled = 1,
22  WriteProvider = 2,
26  WriteChannels = 4,
38  Read = 32,
42  Create = 64,
46  Delete = 128,
50  WriteName = 256,
51  }
52 }
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..ff4bf70aef --- /dev/null +++ b/_chat_bots_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ChatBotsClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatBotsClient.cs File Reference
+
+ + + + + diff --git a/_chat_bots_client_8cs_source.html b/_chat_bots_client_8cs_source.html new file mode 100644 index 0000000000..4d458b2e7f --- /dev/null +++ b/_chat_bots_client_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client.Components
9 {
12  {
20  readonly Instance instance;
21 
27  public ChatBotsClient(IApiClient apiClient, Instance instance)
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
32 
34  public Task<ChatBot> Create(ChatBot settings, CancellationToken cancellationToken) => apiClient.Create<ChatBot, ChatBot>(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken);
35 
37  public Task Delete(ChatBot settings, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.Chat, settings?.Id ?? throw new ArgumentNullException(nameof(settings))), instance.Id, cancellationToken);
38 
40  public Task<IReadOnlyList<ChatBot>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ChatBot>>(Routes.List(Routes.Chat), instance.Id, cancellationToken);
41 
43  public Task<ChatBot> Update(ChatBot settings, CancellationToken cancellationToken) => apiClient.Update<ChatBot, ChatBot>(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken);
44 
46  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);
47  }
48 }
+ + + + +
Routes to a server actions
Definition: Routes.cs:9
+ +
const string Chat
The Models.ChatBot controller
Definition: Routes.cs:69
+ + +
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
+ +
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..cfffb54bab --- /dev/null +++ b/_chat_command_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatCommand.cs File Reference
+
+ + + + + diff --git a/_chat_command_8cs_source.html b/_chat_command_8cs_source.html new file mode 100644 index 0000000000..8fcb7b704b --- /dev/null +++ b/_chat_command_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatCommand.cs
+
+
+Go to the documentation of this file.
2 
3 namespace Tgstation.Server.Host.Components.Interop
4 {
5  sealed class ChatCommand
6  {
7  public string Command { get; set; }
8  public string Parameters { get; set; }
9  public User User { get; set; }
10  }
11 }
+ +
Represents a tgs_chat_user datum
Definition: User.cs:10
+ + + + + +
+ + + + diff --git a/_chat_connection_string_builder_8cs.html b/_chat_connection_string_builder_8cs.html new file mode 100644 index 0000000000..fd4075e329 --- /dev/null +++ b/_chat_connection_string_builder_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/ChatConnectionStringBuilder.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatConnectionStringBuilder.cs File Reference
+
+ + + + + diff --git a/_chat_connection_string_builder_8cs_source.html b/_chat_connection_string_builder_8cs_source.html new file mode 100644 index 0000000000..ca58c11477 --- /dev/null +++ b/_chat_connection_string_builder_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models.Internal
2 {
6  public abstract class ChatConnectionStringBuilder
7  {
11  public abstract bool Valid { get; }
12 
17  public abstract override string ToString();
18  }
19 }
+ + +
+ + + + diff --git a/_chat_controller_8cs.html b/_chat_controller_8cs.html new file mode 100644 index 0000000000..fa4fa30937 --- /dev/null +++ b/_chat_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ChatController.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatController.cs File Reference
+
+ + + + + diff --git a/_chat_controller_8cs_source.html b/_chat_controller_8cs_source.html new file mode 100644 index 0000000000..8422835c83 --- /dev/null +++ b/_chat_controller_8cs_source.html @@ -0,0 +1,142 @@ + + + + + + +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 
20 namespace Tgstation.Server.Host.Controllers
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  return StatusCode((int)HttpStatusCode.Created, dbModel.ToApi());
129  }
130 
132  [TgsAuthorize(ChatBotRights.Delete)]
133  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
134  {
135  var instance = instanceManager.GetInstance(Instance);
136  await Task.WhenAll(instance.Chat.DeleteConnection(id, cancellationToken), DatabaseContext.ChatBots.Where(x => x.Id == id).DeleteAsync(cancellationToken)).ConfigureAwait(false);
137 
138  return Ok();
139  }
140 
142  [TgsAuthorize(ChatBotRights.Read)]
143  public override async Task<IActionResult> List(CancellationToken cancellationToken)
144  {
145  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id).Include(x => x.Channels);
146 
147  var results = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
148 
149  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
150 
151  if (!connectionStrings)
152  foreach (var I in results)
153  I.ConnectionString = null;
154 
155  return Json(results.Select(x => x.ToApi()));
156  }
157 
159  [TgsAuthorize(ChatBotRights.Read)]
160  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
161  {
162  var query = DatabaseContext.ChatBots.Where(x => x.Id == id).Include(x => x.Channels);
163 
164  var results = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
165  if (results == default)
166  return StatusCode((int)HttpStatusCode.Gone);
167 
168  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
169 
170  if (!connectionStrings)
171  results.ConnectionString = null;
172 
173  return Json(results.ToApi());
174  }
175 
177  [TgsAuthorize(ChatBotRights.WriteChannels | ChatBotRights.WriteConnectionString | ChatBotRights.WriteEnabled | ChatBotRights.WriteName | ChatBotRights.WriteProvider)]
178  public override async Task<IActionResult> Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
179  {
180  if (model == null)
181  throw new ArgumentNullException(nameof(model));
182 
183  if (model.Provider.HasValue && !model.ValidateProviderChannelTypes())
184  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
185 
186  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id && x.Id == model.Id).Include(x => x.Channels);
187 
188  var current = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
189 
190  if (current == default)
191  return StatusCode((int)HttpStatusCode.Gone);
192 
193  var userRights = (ChatBotRights)AuthenticationContext.GetRight(RightsType.ChatBots);
194 
195  bool anySettingsModified = false;
196 
197  bool CheckModified<T>(Expression<Func<Api.Models.Internal.ChatBot, T>> expression, ChatBotRights requiredRight)
198  {
199  var memberSelectorExpression = (MemberExpression)expression.Body;
200  var property = (PropertyInfo)memberSelectorExpression.Member;
201 
202  var newVal = property.GetValue(model);
203  if (newVal == null)
204  return false;
205  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
206  return true;
207 
208  property.SetValue(current, newVal);
209  anySettingsModified = true;
210  return false;
211  };
212 
213  var oldProvider = current.Provider;
214 
215  if (CheckModified(x => x.ConnectionString, ChatBotRights.WriteConnectionString)
216  || CheckModified(x => x.Enabled, ChatBotRights.WriteEnabled)
217  || CheckModified(x => x.Name, ChatBotRights.WriteName)
218  || CheckModified(x => x.Provider, ChatBotRights.WriteProvider)
219  || (model.Channels != null && !userRights.HasFlag(ChatBotRights.WriteChannels)))
220  return Forbid();
221 
222  var hasChannels = model.Channels != null;
223  if (hasChannels || (model.Provider.HasValue && model.Provider != oldProvider))
224  {
225  DatabaseContext.ChatChannels.RemoveRange(current.Channels);
226  if (hasChannels)
227  {
228  var dbChannels = model.Channels.Select(x => ConvertApiChatChannel(x)).ToList();
229  DatabaseContext.ChatChannels.AddRange(dbChannels);
230  current.Channels = dbChannels;
231  }
232  else
233  current.Channels.Clear();
234  }
235 
236  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
237 
238  var chat = instanceManager.GetInstance(Instance).Chat;
239 
240  if (anySettingsModified)
241  //have to rebuild the thing first
242  await chat.ChangeSettings(current, cancellationToken).ConfigureAwait(false);
243 
244  if (model.Channels != null || anySettingsModified)
245  await chat.ChangeChannels(current.Id, current.Channels, cancellationToken).ConfigureAwait(false);
246 
247  if (userRights.HasFlag(ChatBotRights.Read))
248  {
249  if (!userRights.HasFlag(ChatBotRights.ReadConnectionString))
250  current.ConnectionString = null;
251  return Json(current.ToApi());
252  }
253  return Ok();
254  }
255  }
256 }
+ + + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ + + + + +
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
+
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
+ +
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
+
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..ba258038de --- /dev/null +++ b/_chat_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ChatFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatFactory.cs File Reference
+
+ + + + + diff --git a/_chat_factory_8cs_source.html b/_chat_factory_8cs_source.html new file mode 100644 index 0000000000..8fbe77c1d0 --- /dev/null +++ b/_chat_factory_8cs_source.html @@ -0,0 +1,127 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Components.Chat
9 {
11  sealed class ChatFactory : IChatFactory
12  {
16  readonly ILoggerFactory loggerFactory;
17 
22 
27 
32 
40  public ChatFactory(IProviderFactory providerFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
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
+ + +
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..b3bd755d47 --- /dev/null +++ b/_chat_provider_8cs.html @@ -0,0 +1,122 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ChatProvider.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatProvider.cs File Reference
+
+ + + + + diff --git a/_chat_provider_8cs_source.html b/_chat_provider_8cs_source.html new file mode 100644 index 0000000000..e1274ce1b6 --- /dev/null +++ b/_chat_provider_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
2 {
6  public enum ChatProvider
7  {
11  Irc,
15  Discord
16  }
17 }
+ +
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..07b1ed2674 --- /dev/null +++ b/_claims_injector_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ClaimsInjector.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ClaimsInjector.cs File Reference
+
+ + + + + diff --git a/_claims_injector_8cs_source.html b/_claims_injector_8cs_source.html new file mode 100644 index 0000000000..2a5ad7af07 --- /dev/null +++ b/_claims_injector_8cs_source.html @@ -0,0 +1,127 @@ + + + + + + +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 
14 namespace Tgstation.Server.Host.Security
15 {
18  {
23 
28 
34  public ClaimsInjector(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory)
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 
75  var authenticationContext = authenticationContextFactory.CurrentAuthenticationContext;
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
+ + + + +
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
+ +
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
+ +
long InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+ + +
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..674b66a5ff --- /dev/null +++ b/_client_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_client_exception_8cs_source.html b/_client_exception_8cs_source.html new file mode 100644 index 0000000000..34327e00b6 --- /dev/null +++ b/_client_exception_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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(ErrorMessage errorMessage, HttpStatusCode statusCode)
Construct a ClientException using an errorMessage and statusCode
+ + + +
ClientException(string message, Exception innerException)
Construct a ClientException with a message and innerException
+ +
ClientException(string message)
Construct a ClientException with a message
+
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..0cbea4092c --- /dev/null +++ b/_comm_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_comm_command_8cs_source.html b/_comm_command_8cs_source.html new file mode 100644 index 0000000000..11c3d80606 --- /dev/null +++ b/_comm_command_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Interop
4 {
8  sealed class CommCommand
9  {
13  public IReadOnlyDictionary<string, string> Parameters { get; set; }
14 
18  public string RawJson { get; set; }
19  }
20 }
+ + + +
+ + + + diff --git a/_comm_context_8cs.html b/_comm_context_8cs.html new file mode 100644 index 0000000000..4af6b68e43 --- /dev/null +++ b/_comm_context_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/CommContext.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CommContext.cs File Reference
+
+ + + + + diff --git a/_comm_context_8cs_source.html b/_comm_context_8cs_source.html new file mode 100644 index 0000000000..cc723ed486 --- /dev/null +++ b/_comm_context_8cs_source.html @@ -0,0 +1,127 @@ + + + + + + +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 
11 namespace Tgstation.Server.Host.Components.Interop
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();
78  cancellationToken = cancellationTokenSource.Token;
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, string>>(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 
133  public void RegisterHandler(ICommHandler handler)
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
+ + + + +
+ + + + diff --git a/_command_factory_8cs.html b/_command_factory_8cs.html new file mode 100644 index 0000000000..1d333f815a --- /dev/null +++ b/_command_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..c23dad73ff --- /dev/null +++ b/_command_factory_8cs_source.html @@ -0,0 +1,134 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Components.Chat.Commands
9 {
12  {
17 
22 
27 
32 
36  readonly Models.Instance instance;
37 
42 
51  public CommandFactory(IApplication application, IByondManager byondManager, IRepositoryManager repositoryManager, IDatabaseContextFactory databaseContextFactory, Models.Instance instance)
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 
64  public void SetWatchdog(IWatchdog watchdog)
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  {
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  }
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
+
For managing the BYOND installation
+
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
+
Factory for creating and loading IRepositorys
+ +
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..37d9ee8489 --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..a000f49432 --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Components.Watchdog
8 {
13  {
17  bool Running { get; }
18 
22  bool AlphaIsActive { get; }
23 
27  Models.CompileJob ActiveCompileJob { get; }
28 
32  DreamDaemonLaunchParameters ActiveLaunchParameters { get; }
33 
37  DreamDaemonLaunchParameters LastLaunchParameters { get; }
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
+ + + + + + + + + +
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..e342c98571 --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IWatchdogFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IWatchdogFactory.cs File Reference
+
+ + + + + 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..6039512a0a --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Watchdog
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 }
+ +
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..d4ab550b41 --- /dev/null +++ b/_components_2_watchdog_2_reattach_information_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..fad001dea8 --- /dev/null +++ b/_components_2_watchdog_2_reattach_information_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Watchdog
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 }
+ + + +
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_8cs.html b/_components_2_watchdog_2_watchdog_8cs.html new file mode 100644 index 0000000000..b3172a8289 --- /dev/null +++ b/_components_2_watchdog_2_watchdog_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Watchdog.cs File Reference
+
+ + + + + diff --git a/_components_2_watchdog_2_watchdog_8cs_source.html b/_components_2_watchdog_2_watchdog_8cs_source.html new file mode 100644 index 0000000000..ee2787c9b8 --- /dev/null +++ b/_components_2_watchdog_2_watchdog_8cs_source.html @@ -0,0 +1,223 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Watchdog.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.Globalization;
9 using System.Linq;
10 using System.Text;
11 using System.Threading;
12 using System.Threading.Tasks;
19 
20 namespace Tgstation.Server.Host.Components.Watchdog
21 {
24  {
28  const int AlphaBravoStartupSeperationInterval = 10;
29 
31  public bool Running { get; private set; }
32 
34  public bool AlphaIsActive { get; private set; }
35 
37  public Models.CompileJob ActiveCompileJob => (AlphaIsActive ? alphaServer : bravoServer)?.Dmb.CompileJob;
38 
40  public DreamDaemonLaunchParameters ActiveLaunchParameters { get; private set; }
41 
43  public DreamDaemonLaunchParameters LastLaunchParameters { get; private set; }
44 
46  public RebootState? RebootState => Running ? (AlphaIsActive ? alphaServer?.RebootState : bravoServer?.RebootState) : null;
47 
51  readonly IChat chat;
52 
57 
62 
67 
72 
76  readonly IByondTopicSender byondTopicSender;
77 
82 
87 
92 
97 
101  readonly ILogger<Watchdog> logger;
102 
106  readonly SemaphoreSlim semaphore;
107 
111  readonly Api.Models.Instance instance;
112 
116  readonly bool autoStart;
117 
121  CancellationTokenSource monitorCts;
122 
127 
131  TaskCompletionSource<object> activeParametersUpdated;
132 
141 
146 
164  public Watchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger<Watchdog> logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
165  {
166  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
167  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
168  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
169  this.reattachInfoHandler = reattachInfoHandler ?? throw new ArgumentNullException(nameof(reattachInfoHandler));
170  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
171  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
172  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
173  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
174  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
175  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
176  ActiveLaunchParameters = initialLaunchParameters ?? throw new ArgumentNullException(nameof(initialLaunchParameters));
177  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
178  this.autoStart = autoStart;
179 
180  if (serverControl == null)
181  throw new ArgumentNullException(nameof(serverControl));
182 
183  chat.RegisterCommandHandler(this);
184 
185  AlphaIsActive = true;
186  ActiveLaunchParameters = initialLaunchParameters;
187  releaseServers = false;
188  activeParametersUpdated = new TaskCompletionSource<object>();
189 
190  restartRegistration = serverControl.RegisterForRestart(this);
191  try
192  {
193  semaphore = new SemaphoreSlim(1);
194  }
195  catch
196  {
197  restartRegistration.Dispose();
198  throw;
199  }
200  }
201 
203  public void Dispose()
204  {
205  DisposeAndNullControllers();
206  semaphore.Dispose();
207  restartRegistration.Dispose();
208  }
209 
214  {
215  alphaServer?.Dispose();
216  alphaServer = null;
217  bravoServer?.Dispose();
218  bravoServer = null;
219  Running = false;
220  }
221 
228  async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
229  {
230  if (!Running)
231  return;
232  if (!graceful)
233  {
234  var chatTask = announce ? chat.SendWatchdogMessage("Terminating...", cancellationToken) : Task.CompletedTask;
235  await StopMonitor().ConfigureAwait(false);
236  DisposeAndNullControllers();
237  LastLaunchParameters = null;
238  await chatTask.ConfigureAwait(false);
239  return;
240  }
241 
242  //merely set the reboot state
243  var toKill = AlphaIsActive ? alphaServer : bravoServer;
244  var other = AlphaIsActive ? bravoServer : alphaServer;
245  if (toKill != null)
246  await toKill.SetRebootState(Components.Watchdog.RebootState.Shutdown, cancellationToken).ConfigureAwait(false);
247  }
248 
256  async Task HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
257  {
258  logger.LogDebug("Monitor activation. Reason: {0}", activationReason);
259 
260  //this is where the bulk of the watchdog handling code lives and is fraught with lambdas, sorry not sorry
261  //I'll do my best to walk you through it
262 
263  //returns true if the inactive server can't be used immediately
264  //also sets monitor to restart if the above holds
265  bool FullRestartDeadInactive()
266  {
267  if (monitorState.RebootingInactiveServer || monitorState.InactiveServerCritFail)
268  {
269  logger.LogInformation("Inactive server is {0}! Restarting monitor...", monitorState.InactiveServerCritFail ? "critically failed" : "still rebooting");
270  monitorState.NextAction = MonitorAction.Restart; //will dispose server
271  return true;
272  }
273  return false;
274  };
275 
276  //trys to set inactive server's port to the public game port
277  //doesn't handle closing active server's port
278  //returns true on success and swaps inactiveserver and activeserver also sets LastLaunchParameters to ActiveLaunchParameters
279  //on failure, sets monitor to restart
280  async Task<bool> MakeInactiveActive()
281  {
282  logger.LogDebug("Setting inactive server to port {0}...", ActiveLaunchParameters.PrimaryPort.Value);
283  var result = await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.PrimaryPort.Value, cancellationToken).ConfigureAwait(false);
284 
285  if (!result)
286  {
287  logger.LogWarning("Failed to activate inactive server! Restarting monitor...");
288  monitorState.NextAction = MonitorAction.Restart; //will dispose server
289  return false;
290  }
291 
292  //inactive server should always be using active launch parameters
293  LastLaunchParameters = ActiveLaunchParameters;
294 
295  var tmp = monitorState.ActiveServer;
296  monitorState.ActiveServer = monitorState.InactiveServer;
297  monitorState.InactiveServer = tmp;
298  AlphaIsActive = !AlphaIsActive;
299  monitorState.ActiveServer.EnableCustomChatCommands();
300  return true;
301  }
302 
303  // Kills and tries to launch inactive server with the latest dmb
304  // falls back to current dmb on failure
305  // Sets critfail on inactive server failing that
306  // returns false if the backup dmb was used successfully, true otherwise
307  async Task UpdateAndRestartInactiveServer(bool breakAfter)
308  {
309  activeParametersUpdated = new TaskCompletionSource<object>();
310  monitorState.InactiveServer.Dispose(); //kill or recycle it
311  var desiredNextAction = breakAfter ? MonitorAction.Break : MonitorAction.Continue;
312  monitorState.NextAction = desiredNextAction;
313 
314  logger.LogInformation("Rebooting inactive server...");
315  var newDmb = dmbFactory.LockNextDmb(1);
316  try
317  {
318  monitorState.InactiveServer = await sessionControllerFactory.LaunchNew(ActiveLaunchParameters, newDmb, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
319  monitorState.InactiveServer.SetHighPriority();
320  }
321  catch (OperationCanceledException)
322  {
323  throw;
324  }
325  catch (Exception e)
326  {
327  logger.LogError("Error occurred while recreating server! Attempting backup strategy of running DMB of running server! Exception: {0}", e.ToString());
328  //ahh jeez, what do we do here?
329  //this is our fault, so it should never happen but
330  //idk maybe a database error while handling the newest dmb?
331  //either way try to start it using the active server's dmb as a backup
332  try
333  {
334  var dmbBackup = await dmbFactory.FromCompileJob(monitorState.ActiveServer.Dmb.CompileJob, cancellationToken).ConfigureAwait(false);
335 
336  if (dmbBackup == null) //NANI!?
337  //just give up, if THAT compile job is failing then the ActiveServer is gonna crash soon too or already has
338  throw new JobException("Creating backup DMB provider failed!");
339 
340  monitorState.InactiveServer = await sessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbBackup, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
341  monitorState.InactiveServer.SetHighPriority();
342  await chat.SendWatchdogMessage("Staging newest DMB on inactive server failed: {0} Falling back to previous dmb...", cancellationToken).ConfigureAwait(false);
343  }
344  catch (OperationCanceledException)
345  {
346  throw;
347  }
348  catch (Exception e2)
349  {
350  //fuuuuucckkk
351  logger.LogError("Backup strategy failed! Monitor will restart when active server reboots! Exception: {0}", e2.ToString());
352  monitorState.InactiveServerCritFail = true;
353  await chat.SendWatchdogMessage("Attempted reboot of inactive server failed. Watchdog will reset when active server fails or exits", cancellationToken).ConfigureAwait(false);
354  return;
355  }
356  }
357 
358  logger.LogInformation("Successfully relaunched inactive server!");
359  monitorState.RebootingInactiveServer = true;
360  }
361 
362  string ExitWord(ISessionController controller) => controller.TerminationWasRequested ? "exited" : "crashed";
363 
364  //reason handling
365  switch (activationReason)
366  {
367  case MonitorActivationReason.ActiveServerCrashed:
368  if (monitorState.ActiveServer.RebootState == Components.Watchdog.RebootState.Shutdown)
369  {
370  //the time for graceful shutdown is now
371  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Exiting due to graceful termination request...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
372  DisposeAndNullControllers();
373  monitorState.NextAction = MonitorAction.Exit;
374  break;
375  }
376 
377  if (FullRestartDeadInactive())
378  {
379  //tell chat about it and go ahead
380  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Inactive server unable to online!", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
381  //we've already been set to restart
382  break;
383  }
384 
385  //tell chat about it
386  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Onlining inactive server...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
387 
388  //try to active the inactive server
389  if (!await MakeInactiveActive().ConfigureAwait(false))
390  //failing that, we've already been set to restart
391  break;
392 
393  //bring up another inactive server
394  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
395  break;
396  case MonitorActivationReason.InactiveServerCrashed:
397  //just announce and try to bring it back
398  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Inactive server {0}! Rebooting...", ExitWord(monitorState.InactiveServer)), cancellationToken).ConfigureAwait(false);
399  await UpdateAndRestartInactiveServer(false).ConfigureAwait(false);
400  break;
401  case MonitorActivationReason.ActiveServerRebooted:
402  //ideal goal: active server just closed its port
403  //tell inactive server to open it's port and that's now the active server
404  var rebootState = monitorState.ActiveServer.RebootState;
405  monitorState.ActiveServer.ResetRebootState(); //the DMAPI has already done this internally
406 
407  if (FullRestartDeadInactive() && rebootState != Components.Watchdog.RebootState.Shutdown)
408  //full restart if the inactive server is being fucky
409  break;
410 
411  //what matters here is the RebootState
412  var restartOnceSwapped = false;
413 
414  switch (rebootState)
415  {
416  case Components.Watchdog.RebootState.Normal:
417  //life as normal
418  break;
419  case Components.Watchdog.RebootState.Restart:
420  //reboot the current active server once the inactive one activates
421  restartOnceSwapped = true;
422  break;
423  case Components.Watchdog.RebootState.Shutdown:
424  //graceful shutdown time
425  await chat.SendWatchdogMessage("Active server rebooted! Exiting due to graceful termination request...", cancellationToken).ConfigureAwait(false);
426  DisposeAndNullControllers();
427  monitorState.NextAction = MonitorAction.Exit;
428  return;
429  }
430 
431  //are both servers now running the same CompileJob?
432  var sameCompileJob = monitorState.InactiveServer.Dmb.CompileJob.Id == monitorState.ActiveServer.Dmb.CompileJob.Id;
433 
434  if (!sameCompileJob || ActiveLaunchParameters != LastLaunchParameters)
435  //need a new launch to update either settings or compile job
436  restartOnceSwapped = true;
437 
438  if (restartOnceSwapped)
439  //we need to manually restart active server
440  //just kill it here, easier that way
441  monitorState.ActiveServer.Dispose();
442 
443  var activeServerStillHasPortOpen = !restartOnceSwapped && !monitorState.ActiveServer.ClosePortOnReboot;
444 
445  if (activeServerStillHasPortOpen)
446  //we didn't want active server to swap for some reason and it still has it's port open
447  //just continue as normal
448  break;
449 
450  if (!await MakeInactiveActive().ConfigureAwait(false))
451  //monitor will restart
452  break;
453 
454  //servers now swapped
455 
456  //enable this now
457  monitorState.ActiveServer.ClosePortOnReboot = true;
458 
459  if (!restartOnceSwapped)
460  {
461  //inactive server still valid
462 
463  //disable this
464  monitorState.InactiveServer.ClosePortOnReboot = false;
465 
466  //now try to reopen it on the private port
467  //failing that, just reboot it
468  restartOnceSwapped = !await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.SecondaryPort.Value, cancellationToken).ConfigureAwait(false);
469  }
470 
471  //break either way because any issues past this point would be solved by the reboot
472  if (restartOnceSwapped)
473  //for one reason or another
474  //update and reboot
475  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
476  else
477  //only skip checking inactive server rebooted, it's guaranteed InactiveServerStartup complete wouldn't fire this iteration
478  monitorState.NextAction = MonitorAction.Skip;
479  break;
480  case MonitorActivationReason.InactiveServerRebooted:
481  //just don't let the active server close it's port if the inactive server isn't ready
482  monitorState.RebootingInactiveServer = true;
483  monitorState.InactiveServer.ResetRebootState();
484  monitorState.ActiveServer.ClosePortOnReboot = false;
485  monitorState.NextAction = MonitorAction.Continue;
486  break;
487  case MonitorActivationReason.InactiveServerStartupComplete:
488  //opposite of above case
489  monitorState.RebootingInactiveServer = false;
490  monitorState.ActiveServer.ClosePortOnReboot = true;
491  monitorState.NextAction = MonitorAction.Continue;
492  break;
493  case MonitorActivationReason.NewDmbAvailable:
494  case MonitorActivationReason.ActiveLaunchParametersUpdated:
495  //just reload the inactive server and wait for a swap to apply the changes
496  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
497  break;
498  }
499  }
500 
506  async Task MonitorLifetimes(CancellationToken cancellationToken)
507  {
508  logger.LogTrace("Entered MonitorLifetimes");
509 
510  //this function is responsible for calling HandlerMonitorWakeup when necessary and manitaining the MonitorState
511 
512  var iteration = 1;
513  for (var monitorState = new MonitorState(); monitorState.NextAction != MonitorAction.Exit; ++iteration)
514  {
515  //always start out with continue
516  monitorState.NextAction = MonitorAction.Continue;
517 
518  //dump some info to the logs
519  logger.LogDebug("Iteration {0} of monitor loop", iteration);
520  try
521  {
522  if (AlphaIsActive)
523  logger.LogDebug("Alpha is the active server");
524  else
525  logger.LogDebug("Bravo is the active server");
526 
527 
528  if (monitorState.RebootingInactiveServer)
529  logger.LogDebug("Inactive server is rebooting");
530 
531  //update the monitor state with the inactive/active servers
532  monitorState.ActiveServer = AlphaIsActive ? alphaServer : bravoServer;
533  monitorState.InactiveServer = AlphaIsActive ? bravoServer : alphaServer;
534 
535  if (monitorState.ActiveServer.ClosePortOnReboot)
536  logger.LogDebug("Active server will close port on reboot");
537  if (monitorState.InactiveServer.ClosePortOnReboot)
538  logger.LogDebug("Inactive server will close port on reboot");
539 
540  logger.LogDebug("Active server Compile Job ID: {0}", monitorState.ActiveServer.Dmb.CompileJob.Id);
541  logger.LogDebug("Inactive server Compile Job ID: {0}", monitorState.InactiveServer.Dmb.CompileJob.Id);
542 
543  //load the activation tasks into local variables
544  Task activeServerLifetime = monitorState.ActiveServer.Lifetime;
545  Task inactiveServerLifetime = monitorState.InactiveServer.Lifetime;
546  var activeServerReboot = monitorState.ActiveServer.OnReboot;
547  var inactiveServerReboot = monitorState.InactiveServer.OnReboot;
548  Task inactiveServerStartup = monitorState.RebootingInactiveServer ? monitorState.InactiveServer.LaunchResult : null;
549  Task activeLaunchParametersChanged = activeParametersUpdated.Task;
550  var newDmbAvailable = dmbFactory.OnNewerDmb;
551 
552  //cancel waiting if requested
553  var cancelTcs = new TaskCompletionSource<object>();
554  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
555  {
556  var toWaitOn = Task.WhenAny(activeServerLifetime, inactiveServerLifetime, activeServerReboot, inactiveServerReboot, newDmbAvailable, cancelTcs.Task, activeLaunchParametersChanged);
557  if (monitorState.RebootingInactiveServer)
558  toWaitOn = Task.WhenAny(toWaitOn, inactiveServerStartup);
559  //wait for something to happen
560  await toWaitOn.ConfigureAwait(false);
561  cancellationToken.ThrowIfCancellationRequested();
562  }
563 
564  var chatTask = Task.CompletedTask;
565  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
566  {
567  //always run HandleMonitorWakeup from the context of the semaphore lock
568  //multiple things may have happened, handle them one at a time
569  for (var moreActivationsToProcess = true; moreActivationsToProcess && (monitorState.NextAction == MonitorAction.Continue || monitorState.NextAction == MonitorAction.Skip);)
570  {
571  MonitorActivationReason activationReason = default; //this will always be assigned before being used
572 
573  //process the tasks in this order and call HandlerMonitorWakup for each
574 
575  bool CheckActivationReason(ref Task task, MonitorActivationReason testActivationReason)
576  {
577  var taskCompleted = task?.IsCompleted == true;
578  task = null;
579  if (monitorState.NextAction == MonitorAction.Skip)
580  monitorState.NextAction = MonitorAction.Continue;
581  else if (taskCompleted)
582  {
583  activationReason = testActivationReason;
584  return true;
585  }
586  return false;
587  };
588 
589  if (CheckActivationReason(ref activeServerLifetime, MonitorActivationReason.ActiveServerCrashed)
590  || CheckActivationReason(ref inactiveServerLifetime, MonitorActivationReason.InactiveServerCrashed)
591  || CheckActivationReason(ref activeServerReboot, MonitorActivationReason.ActiveServerRebooted)
592  || CheckActivationReason(ref inactiveServerReboot, MonitorActivationReason.InactiveServerRebooted)
593  || CheckActivationReason(ref inactiveServerStartup, MonitorActivationReason.InactiveServerStartupComplete)
594  || CheckActivationReason(ref newDmbAvailable, MonitorActivationReason.NewDmbAvailable)
595  || CheckActivationReason(ref activeLaunchParametersChanged, MonitorActivationReason.ActiveLaunchParametersUpdated))
596  await HandlerMonitorWakeup(activationReason, monitorState, cancellationToken).ConfigureAwait(false);
597  else
598  moreActivationsToProcess = false;
599  }
600 
601  //writeback alphaServer and bravoServer from monitor state in case they changesd
602  alphaServer = AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
603  bravoServer = !AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
604  }
605 
606  //full reboot required
607  if (monitorState.NextAction == MonitorAction.Restart)
608  {
609  logger.LogDebug("Next state action is to restart");
610  DisposeAndNullControllers();
611  chatTask = chat.SendWatchdogMessage("Restarting entirely due to complications...", cancellationToken);
612 
613  for (var retryAttempts = 1; monitorState.NextAction == MonitorAction.Restart; ++retryAttempts)
614  {
615  Exception launchException = null;
616  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
617  try
618  {
619  //use LaunchImplNoLock without announcements or restarting the monitor
620  await LaunchImplNoLock(false, false, null, cancellationToken).ConfigureAwait(false);
621  if (Running)
622  {
623  logger.LogDebug("Relaunch successful, resetting monitor state...");
624  monitorState = new MonitorState(); //clean the slate and continue
625  }
626  }
627  catch (OperationCanceledException)
628  {
629  throw;
630  }
631  catch (Exception e)
632  {
633  launchException = e;
634  }
635 
636  await chatTask.ConfigureAwait(false);
637  if (!Running)
638  {
639  if (launchException == null)
640  logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}", retryAttempts);
641  else
642  logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}, Exception: {1}", retryAttempts, launchException);
643  var retryDelay = Math.Min(Math.Pow(2, retryAttempts), 3600); //max of one hour, increasing by a power of 2 each time
644  chatTask = chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Failed to restart watchdog (Attempt: {0}), retrying in {1} seconds...", retryAttempts, retryDelay), cancellationToken);
645  await Task.WhenAll(asyncDelayer.Delay(TimeSpan.FromSeconds(retryDelay), cancellationToken), chatTask).ConfigureAwait(false);
646  }
647  }
648  }
649  }
650  catch (OperationCanceledException)
651  {
652  logger.LogDebug("Monitor cancelled");
653  break;
654  }
655  catch (Exception e)
656  {
657  //really, this should NEVER happen
658  logger.LogError("Monitor crashed! Iteration: {0}, State: {1}, Exception: {2}", iteration, JsonConvert.SerializeObject(monitorState), e);
659  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);
660  }
661  }
662  logger.LogTrace("Monitor exiting...");
663  }
664 
669  async Task<bool> StopMonitor()
670  {
671  logger.LogTrace("StopMonitor");
672  if (monitorTask == null)
673  return false;
674  monitorCts.Cancel();
675  await monitorTask.ConfigureAwait(false);
676  monitorCts.Dispose();
677  monitorTask = null;
678  return true;
679  }
680 
681 
683  public async Task ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
684  {
685  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
686  {
687  if (launchParameters.Match(ActiveLaunchParameters))
688  return;
689  ActiveLaunchParameters = launchParameters;
690  if (Running)
691  //queue an update
692  activeParametersUpdated.TrySetResult(null);
693  }
694  }
695 
704  async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
705  {
706  logger.LogTrace("Begin LaunchNoLock");
707 
708  if (Running)
709  throw new JobException("Watchdog already running!");
710 
711  Task chatTask;
712  //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
713  if (startMonitor && await StopMonitor().ConfigureAwait(false))
714  chatTask = chat.SendWatchdogMessage("Automatic retry sequence cancelled by manual launch. Restarting...", cancellationToken);
715  else if (announce)
716  //simple announce
717  chatTask = chat.SendWatchdogMessage(reattachInfo == null ? "Starting..." : "Reattaching...", cancellationToken);
718  else
719  //no announce
720  chatTask = Task.CompletedTask;
721 
722  //since neither server is running, this is safe to do
723  LastLaunchParameters = ActiveLaunchParameters;
724 
725  //for when we call ourself and want to not catch thrown exceptions
726  var ignoreNestedException = false;
727  try
728  {
729  //good ole sanity, should never fucking trigger but i don't trust myself even though I should
730  if (alphaServer != null || bravoServer != null)
731  throw new InvalidOperationException("Entered LaunchNoLock with one or more of the servers not being null!");
732 
733  //don't need a new dmb if reattaching
734  var doesntNeedNewDmb = reattachInfo?.Alpha != null && reattachInfo?.Bravo != null;
735  var dmbToUse = doesntNeedNewDmb ? null : dmbFactory.LockNextDmb(2);
736 
737  //if this try catches something, both servers are killed
738  try
739  {
740  //start the alpha server task, either by launch a new process or attaching to an existing one
741  //The tasks returned are mainly for writing interop files to the directories among other things and should generally never fail
742  //The tasks pertaining to server startup times are in the ISessionControllers
743  Task<ISessionController> alphaServerTask;
744  if (!doesntNeedNewDmb)
745  alphaServerTask = sessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, true, true, false, cancellationToken);
746  else
747  alphaServerTask = sessionControllerFactory.Reattach(reattachInfo.Alpha, cancellationToken);
748 
749  //retrieve the session controller
750  var startTime = DateTimeOffset.Now;
751  alphaServer = await alphaServerTask.ConfigureAwait(false);
752  //failed reattaches will return null
753  alphaServer?.SetHighPriority();
754 
755  //extra delay for total ordering
756  var now = DateTimeOffset.Now;
757  var delay = now - startTime;
758 
759  //definitely not if reattaching though
760  if (reattachInfo == null && delay.TotalSeconds < AlphaBravoStartupSeperationInterval)
761  await asyncDelayer.Delay(startTime.AddSeconds(AlphaBravoStartupSeperationInterval) - now, cancellationToken).ConfigureAwait(false);
762 
763  //now bring bravo up
764  if (!doesntNeedNewDmb)
765  bravoServer = await sessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, false, false, false, cancellationToken).ConfigureAwait(false);
766  else
767  bravoServer = await sessionControllerFactory.Reattach(reattachInfo.Bravo, cancellationToken).ConfigureAwait(false);
768  //failed reattaches will return null
769  bravoServer?.SetHighPriority();
770 
771  //possiblity of null servers due to failed reattaches
772  if (alphaServer == null || bravoServer == null)
773  {
774  await chatTask.ConfigureAwait(false);
775  var bothServersDead = alphaServer == null && bravoServer == null;
776  if (bothServersDead
777  || (alphaServer == null && reattachInfo.AlphaIsActive)
778  || (bravoServer == null && !reattachInfo.AlphaIsActive))
779  {
780  //we lost the active server, just restart entirely
781  DisposeAndNullControllers();
782  const string FailReattachMessage = "Unable to properly reattach to active server! Restarting...";
783  logger.LogWarning(FailReattachMessage);
784  logger.LogDebug(bothServersDead ? "Also could not reattach to inactive server!" : "Inactive server was reattached successfully!");
785  chatTask = chat.SendWatchdogMessage(FailReattachMessage, cancellationToken);
786  ignoreNestedException = true;
787  await LaunchImplNoLock(true, false, null, cancellationToken).ConfigureAwait(false);
788  return;
789  }
790 
791  //we still have the active server but the other one is dead to us, hand it off to the monitor to restart
792  const string InactiveReattachFailureMessage = "Unable to reattach to inactive server. Leaving for monitor to reboot...";
793  chatTask = chat.SendWatchdogMessage(InactiveReattachFailureMessage, cancellationToken);
794  logger.LogWarning(InactiveReattachFailureMessage);
795 
796  if (reattachInfo.AlphaIsActive)
797  bravoServer = sessionControllerFactory.CreateDeadSession(reattachInfo.Bravo.Dmb);
798  else
799  alphaServer = sessionControllerFactory.CreateDeadSession(reattachInfo.Alpha.Dmb);
800  }
801 
802  //throws a JobException if something went wrong with a launch
803  //Dead sessions won't trigger this
804  async Task<LaunchResult> CheckLaunch(ISessionController controller, string serverName)
805  {
806  var launch = await controller.LaunchResult.ConfigureAwait(false);
807  if (launch.ExitCode.HasValue)
808  //you killed us ray...
809  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{1} server failed to start: {0}", launch.ToString(), serverName));
810  if (!launch.StartupTime.HasValue)
811  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{1} server timed out on startup: {0}s", launch.ToString(), ActiveLaunchParameters.StartupTimeout.Value));
812  return launch;
813  }
814 
815  var alphaLrt = CheckLaunch(alphaServer, "Alpha");
816  var bravoLrt = CheckLaunch(bravoServer, "Bravo");
817  //this task completes when both serers have finished booting
818  var allTask = Task.WhenAll(alphaLrt, bravoLrt);
819 
820  //don't forget about the cancellationToken
821  var cancelTcs = new TaskCompletionSource<object>();
822  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
823  await Task.WhenAny(allTask, cancelTcs.Task).ConfigureAwait(false);
824  cancellationToken.ThrowIfCancellationRequested();
825 
826  await allTask.ConfigureAwait(false);
827 
828  //both servers are now running, alpha is the active server(unless reattach), huzzah
829  AlphaIsActive = reattachInfo?.AlphaIsActive ?? true;
830 
831  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
832  activeServer.EnableCustomChatCommands();
833  activeServer.ClosePortOnReboot = true;
834 
835  logger.LogInformation("Launched servers successfully");
836  Running = true;
837 
838  if (startMonitor)
839  {
840  monitorCts = new CancellationTokenSource();
841  monitorTask = MonitorLifetimes(monitorCts.Token);
842  }
843  }
844  catch
845  {
846  if (dmbToUse != null)
847  {
848  //we locked 2 dmbs
849  if (bravoServer == null)
850  {
851  //bravo didn't get control of his
852  dmbToUse.Dispose();
853  if (alphaServer == null)
854  //alpha didn't get control of his
855  dmbToUse.Dispose();
856  }
857  }
858  else if (doesntNeedNewDmb)
859  //we have reattachInfo
860  if (bravoServer == null)
861  {
862  //bravo didn't get control of his
863  reattachInfo.Bravo?.Dmb.Dispose();
864  if (alphaServer == null)
865  //alpha didn't get control of his
866  reattachInfo.Alpha?.Dmb.Dispose();
867  }
868  //kill the controllers
869  DisposeAndNullControllers();
870  throw;
871  }
872  }
873  catch (Exception e)
874  {
875  //don't try to send chat tasks or warning logs if were suppressing exceptions or cancelled
876  if (!ignoreNestedException && !cancellationToken.IsCancellationRequested)
877  {
878  var originalChatTask = chatTask;
879  async Task ChainChatTaskWithErrorMessage()
880  {
881  await originalChatTask.ConfigureAwait(false);
882  await chat.SendWatchdogMessage("Startup failed!", cancellationToken).ConfigureAwait(false);
883  }
884  chatTask = ChainChatTaskWithErrorMessage();
885  logger.LogWarning("Failed to start watchdog: {0}", e.ToString());
886  }
887  throw;
888  }
889  finally
890  {
891  //finish the chat task that's in flight
892  try
893  {
894  await chatTask.ConfigureAwait(false);
895  }
896  catch (OperationCanceledException) { }
897  }
898  }
899 
901  public async Task Launch(CancellationToken cancellationToken)
902  {
903  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
904  await LaunchImplNoLock(true, true, null, cancellationToken).ConfigureAwait(false);
905  }
906 
908  public async Task ResetRebootState(CancellationToken cancellationToken)
909  {
910  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
911  {
912  if (!Running)
913  return;
914  var toClear = AlphaIsActive ? alphaServer : bravoServer;
915  if (toClear != null)
916  toClear.ResetRebootState();
917  }
918  }
919 
921  public async Task Restart(bool graceful, CancellationToken cancellationToken)
922  {
923  logger.LogTrace("Begin Restart. Graceful: {0}", graceful);
924  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
925  {
926  if (!graceful || !Running)
927  {
928  Task chatTask;
929  if (Running)
930  {
931  chatTask = chat.SendWatchdogMessage("Manual restart triggered...", cancellationToken);
932  await TerminateNoLock(false, false, cancellationToken).ConfigureAwait(false);
933  }
934  else
935  chatTask = Task.CompletedTask;
936  await LaunchImplNoLock(true, !Running, null, cancellationToken).ConfigureAwait(false);
937  await chatTask.ConfigureAwait(false);
938  }
939  var toReboot = AlphaIsActive ? alphaServer : bravoServer;
940  if (toReboot != null)
941  {
942  if (!await toReboot.SetRebootState(Components.Watchdog.RebootState.Restart, cancellationToken).ConfigureAwait(false))
943  logger.LogWarning("Unable to send reboot state change event!");
944  }
945  }
946  }
947 
949  public async Task Terminate(bool graceful, CancellationToken cancellationToken)
950  {
951  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
952  await TerminateNoLock(graceful, !releaseServers, cancellationToken).ConfigureAwait(false);
953  }
954 
956  public async Task StartAsync(CancellationToken cancellationToken)
957  {
958  var reattachInfo = await reattachInfoHandler.Load(cancellationToken).ConfigureAwait(false);
959  if (!autoStart && reattachInfo == null)
960  return;
961 
962  long? adminUserId = null;
963 
964  await databaseContextFactory.UseContext(async db => adminUserId = await db.Users
965  .Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant())
966  .Select(x => x.Id)
967  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
968  var job = new Models.Job
969  {
970  StartedBy = new Models.User
971  {
972  Id = adminUserId.Value
973  },
974  Instance = new Models.Instance
975  {
976  Id = instance.Id
977  },
978  Description = "Instance startup watchdog launch",
979  CancelRight = (ulong)DreamDaemonRights.Shutdown,
980  CancelRightsType = RightsType.DreamDaemon
981  };
982  await jobManager.RegisterOperation(job, async (j, databaseContext, progressFunction, ct) =>
983  {
984  using (await SemaphoreSlimContext.Lock(semaphore, ct).ConfigureAwait(false))
985  await LaunchImplNoLock(true, true, reattachInfo, ct).ConfigureAwait(false);
986  }, cancellationToken).ConfigureAwait(false);
987  }
988 
990  public async Task StopAsync(CancellationToken cancellationToken)
991  {
992  if (releaseServers && Running)
993  {
994  await StopMonitor().ConfigureAwait(false);
995 
996  var reattachInformation = new WatchdogReattachInformation
997  {
998  AlphaIsActive = AlphaIsActive
999  };
1000  reattachInformation.Alpha = alphaServer?.Release();
1001  reattachInformation.Bravo = bravoServer?.Release();
1002  await reattachInfoHandler.Save(reattachInformation, cancellationToken).ConfigureAwait(false);
1003  }
1004  await Terminate(false, cancellationToken).ConfigureAwait(false);
1005  }
1006 
1008  public async Task<bool> HandleEvent(EventType eventType, IEnumerable<string> parameters, CancellationToken cancellationToken)
1009  {
1010  string results;
1011  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
1012  {
1013  if (!Running)
1014  return true;
1015 
1016  var builder = new StringBuilder(Constants.DMTopicEvent);
1017  builder.Append('&');
1018  var notification = new EventNotification
1019  {
1020  Type = eventType,
1021  Parameters = parameters
1022  };
1023  var json = JsonConvert.SerializeObject(notification);
1024  builder.Append(byondTopicSender.SanitizeString(Constants.DMParameterData));
1025  builder.Append('=');
1026  builder.Append(byondTopicSender.SanitizeString(json));
1027 
1028  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
1029  results = await activeServer.SendCommand(builder.ToString(), cancellationToken).ConfigureAwait(false);
1030  }
1031 
1032  if (results == Constants.DMResponseSuccess)
1033  return true;
1034 
1035  List<Response> responses;
1036  try
1037  {
1038  responses = JsonConvert.DeserializeObject<List<Response>>(results);
1039  }
1040  catch
1041  {
1042  logger.LogInformation("Recieved invalid response from DD when parsing event {0}:{1}{2}", eventType, Environment.NewLine, results);
1043  return true;
1044  }
1045 
1046  await Task.WhenAll(responses.Select(x => chat.SendMessage(x.Message, x.ChannelIds, cancellationToken))).ConfigureAwait(false);
1047 
1048  return true;
1049  }
1050 
1052  public async Task<string> HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)
1053  {
1054  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
1055  {
1056  if (!Running)
1057  return "ERROR: Server offline!";
1058 
1059  var commandObject = new ChatCommand
1060  {
1061  Command = commandName,
1062  Parameters = arguments,
1063  User = sender
1064  };
1065 
1066  var json = JsonConvert.SerializeObject(commandObject, new JsonSerializerSettings
1067  {
1068  ContractResolver = new CamelCasePropertyNamesContractResolver()
1069  });
1070 
1071  var command = String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChatCommand), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(json));
1072 
1073  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
1074  return await activeServer.SendCommand(command, cancellationToken).ConfigureAwait(false) ?? "ERROR: Bad topic exchange!";
1075  }
1076  }
1077 
1079  public async Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
1080  {
1081  releaseServers = true;
1082  if (Running)
1083  await chat.SendWatchdogMessage("Detaching...", cancellationToken).ConfigureAwait(false);
1084  }
1085  }
1086 }
+
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 IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Watchdog
Definition: Watchdog.cs:71
+
async Task Launch(CancellationToken cancellationToken)
Start the IWatchdog
Definition: Watchdog.cs:901
+ + +
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+ +
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
+
void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
Registers a customCommandHandler to use
+ +
MonitorAction NextAction
The next MonitorAction to take in Watchdog.MonitorLifetimes(System.Threading.CancellationToken) ...
Definition: MonitorState.cs:23
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
async Task Terminate(bool graceful, CancellationToken cancellationToken)
Stops the watchdog
Definition: Watchdog.cs:949
+ +
bool releaseServers
If the servers should be released instead of shutdown
Definition: Watchdog.cs:145
+
async Task Restart(bool graceful, CancellationToken cancellationToken)
Restarts the watchdog
Definition: Watchdog.cs:921
+
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 ...
+ + + +
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
+
Represents a server User
Definition: User.cs:10
+ +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ + +
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the Watchdog
Definition: Watchdog.cs:704
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
Task monitorTask
The Task running the monitor loop
Definition: Watchdog.cs:126
+ + +
async Task ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart ...
Definition: Watchdog.cs:683
+
async Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
Handle a restart of the server
Definition: Watchdog.cs:1079
+
For managing connected chat services
Definition: IChat.cs:13
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+ +
Handles communication with a DreamDaemon IProcess
+
bool IsPrimary
If the IDmbProvider.PrimaryDirectory of Dmb is being used
+ +
readonly IEventConsumer eventConsumer
The IEventConsumer for the Watchdog
Definition: Watchdog.cs:81
+
void SetHighPriority()
Set&#39;s the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal
+
bool TerminationWasRequested
If the DreamDaemon instance sent a
+
async Task< string > HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)
Definition: Watchdog.cs:1052
+ +
void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to
Definition: Watchdog.cs:213
+ +
bool RebootingInactiveServer
If the inactive server is being rebooted
Definition: MonitorState.cs:13
+
readonly IJobManager jobManager
The IJobManager for the Watchdog
Definition: Watchdog.cs:86
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the Watchdog
Definition: Watchdog.cs:111
+
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:106
+ +
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn&#39;t kill the servers
Definition: Watchdog.cs:669
+ +
async Task ResetRebootState(CancellationToken cancellationToken)
Cancels pending graceful actions
Definition: Watchdog.cs:908
+
ReattachInformation Alpha
ReattachInformation for the Alpha session
+
async Task MonitorLifetimes(CancellationToken cancellationToken)
The loop that watches the watchdog
Definition: Watchdog.cs:506
+ +
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for the Watchdog
Definition: Watchdog.cs:56
+ +
async Task StopAsync(CancellationToken cancellationToken)
Definition: Watchdog.cs:990
+
MonitorActivationReason
Reasons for the monitor to wake up
+
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 ...
+ +
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+ + +
ISessionController ActiveServer
The active ISessionController
Definition: MonitorState.cs:29
+ + + + + +
ISessionController InactiveServer
The inactive ISessionController
Definition: MonitorState.cs:35
+ +
async Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
Definition: Watchdog.cs:1008
+
Watchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< Watchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
Construct a IWatchdog
Definition: Watchdog.cs:164
+ +
readonly bool autoStart
If the Watchdog should LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken) i...
Definition: Watchdog.cs:116
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: Watchdog.cs:956
+
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
async Task HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
Handles the actions to take when the monitor has to "wake up"
Definition: Watchdog.cs:256
+ +
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the Watchdog
Definition: Watchdog.cs:66
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
ReattachInformation Bravo
ReattachInformation for the Bravo session
+
async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
Implementation of Terminate(bool, CancellationToken). Does not lock semaphore
Definition: Watchdog.cs:228
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the Watchdog
Definition: Watchdog.cs:61
+
bool Match(DreamDaemonLaunchParameters otherParameters)
Check if we match a given set of otherParameters
+
Represents the lifetime of a IRestartHandler registration
+
CancellationTokenSource monitorCts
The CancellationTokenSource for the monitor loop
Definition: Watchdog.cs:121
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Watchdog
Definition: Watchdog.cs:91
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Watchdog
Definition: Watchdog.cs:96
+ +
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+
TaskCompletionSource< object > activeParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: Watchdog.cs:131
+
The (absolute) state of the Watchdog
Definition: MonitorState.cs:8
+
Handles saving and loading WatchdogReattachInformation
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI ...
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the Watchdog
Definition: Watchdog.cs:76
+
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...
+
+ + + + 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..2388323772 --- /dev/null +++ b/_components_2_watchdog_2_watchdog_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogFactory.cs File Reference
+
+ + + + + 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..671801a97c --- /dev/null +++ b/_components_2_watchdog_2_watchdog_factory_8cs_source.html @@ -0,0 +1,138 @@ + + + + + + +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 System;
8 
9 namespace Tgstation.Server.Host.Components.Watchdog
10 {
13  {
18 
22  readonly ILoggerFactory loggerFactory;
23 
28 
32  readonly IByondTopicSender byondTopicSender;
33 
38 
43 
53  public WatchdogFactory(IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager, IAsyncDelayer asyncDelayer)
54  {
55  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
56  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
57  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
58  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
59  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
60  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
61  }
62 
64  public IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings) => new Watchdog(chat, sessionControllerFactory, dmbFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, asyncDelayer, loggerFactory.CreateLogger<Watchdog>(), settings, instance, settings.AutoStart.Value);
65  }
66 }
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
+
bool AutoStart
If DreamDaemon starts when it&#39;s Instance starts
+ + +
For managing connected chat services
Definition: IChat.cs:13
+ +
WatchdogFactory(IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager, IAsyncDelayer asyncDelayer)
Construct a 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
+
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..78a81c5eff --- /dev/null +++ b/_components_2_watchdog_2_watchdog_reattach_information_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogReattachInformation.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogReattachInformation.cs File Reference
+
+ + + + + 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..2434028e56 --- /dev/null +++ b/_components_2_watchdog_2_watchdog_reattach_information_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Watchdog
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 }
+ + + + + +
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
+ +
Parameters necessary for duplicating a ISessionController session
+ +
+ + + + diff --git a/_configuration_8cs.html b/_configuration_8cs.html new file mode 100644 index 0000000000..dfa4b53fca --- /dev/null +++ b/_configuration_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..ef376e223d --- /dev/null +++ b/_configuration_8cs_source.html @@ -0,0 +1,149 @@ + + + + + + +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.Runtime.InteropServices;
8 using System.Security.Cryptography;
9 using System.Text;
10 using System.Threading;
11 using System.Threading.Tasks;
14 using Tgstation.Server.Host.IO;
16 
17 namespace Tgstation.Server.Host.Components.StaticFiles
18 {
21  {
22  const string CodeModificationsSubdirectory = "CodeModifications";
23  const string EventScriptsSubdirectory = "EventScripts";
24  const string GameStaticFilesSubdirectory = "GameStaticFiles";
25 
29  const string StaticIgnoreFile = ".tgsignore";
30 
31  const string CodeModificationsHeadFile = "HeadInclude.dm";
32  const string CodeModificationsTailFile = "TailInclude.dm";
33 
34  static readonly IReadOnlyDictionary<EventType, string> EventTypeScriptFileNameMap = new Dictionary<EventType, string>
35  {
36  { EventType.CompileStart, "PreCompile" },
37  { EventType.CompileComplete, "PostCompile" },
38  { EventType.RepoPreSynchronize, "PreSynchronize" }
39  };
40 
45 
50 
55 
60 
65 
70 
74  readonly ILogger<Configuration> logger;
75 
79  readonly SemaphoreSlim semaphore;
80 
91  public Configuration(IIOManager ioManager, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IPlatformIdentifier platformIdentifier, ILogger<Configuration> logger)
92  {
93  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
94  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
95  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
96  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
97  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
98  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
99  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
100 
101  semaphore = new SemaphoreSlim(1);
102  }
103 
105  public void Dispose() => semaphore.Dispose();
106 
111  string StaticIgnorePath() => ioManager.ConcatPath(GameStaticFilesSubdirectory, StaticIgnoreFile);
112 
118  async Task EnsureDirectories(CancellationToken cancellationToken)
119  {
120  async Task ValidateStaticFolder()
121  {
122  await ioManager.CreateDirectory(GameStaticFilesSubdirectory, cancellationToken).ConfigureAwait(false);
123  var staticIgnorePath = StaticIgnorePath();
124  if(!await ioManager.FileExists(staticIgnorePath, cancellationToken).ConfigureAwait(false))
125  await ioManager.WriteAllBytes(staticIgnorePath, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
126  }
127 
128  await Task.WhenAll(ioManager.CreateDirectory(CodeModificationsSubdirectory, cancellationToken), ioManager.CreateDirectory(EventScriptsSubdirectory, cancellationToken), ValidateStaticFolder()).ConfigureAwait(false);
129  }
130 
132  public async Task<ServerSideModifications> CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken)
133  {
134 
135  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
136  {
137  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
138 
139  //just assume no other fs race conditions here
140  var dmeExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, dmeFile), cancellationToken);
141  var headFileExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, CodeModificationsHeadFile), cancellationToken);
142  var tailFileExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, CodeModificationsTailFile), cancellationToken);
143  var copyTask = ioManager.CopyDirectory(CodeModificationsSubdirectory, destination, null, cancellationToken);
144 
145  await Task.WhenAll(dmeExistsTask, headFileExistsTask, tailFileExistsTask, copyTask).ConfigureAwait(false);
146 
147  if (!dmeExistsTask.Result && !headFileExistsTask.Result && !tailFileExistsTask.Result)
148  return null;
149 
150  if (dmeExistsTask.Result)
151  return new ServerSideModifications(null, null, true);
152 
153  if (!headFileExistsTask.Result && !tailFileExistsTask.Result)
154  return null;
155 
156  string IncludeLine(string filePath) => String.Format(CultureInfo.InvariantCulture, "#include \"{0}\"", filePath);
157 
158  return new ServerSideModifications(headFileExistsTask.Result ? IncludeLine(CodeModificationsHeadFile) : null, tailFileExistsTask.Result ? IncludeLine(CodeModificationsTailFile) : null, false);
159  }
160  }
161 
162  string ValidateConfigRelativePath(string configurationRelativePath)
163  {
164  var nullOrEmptyCheck = String.IsNullOrEmpty(configurationRelativePath);
165  if (nullOrEmptyCheck)
166  configurationRelativePath = ".";
167  if (configurationRelativePath[0] == Path.DirectorySeparatorChar || configurationRelativePath[0] == Path.AltDirectorySeparatorChar)
168  configurationRelativePath = '.' + configurationRelativePath;
169  var resolved = ioManager.ResolvePath(configurationRelativePath);
170  var local = !nullOrEmptyCheck ? ioManager.ResolvePath(".") : null;
171  if (!nullOrEmptyCheck && resolved.Length < local.Length) //.. fuccbois
172  throw new InvalidOperationException("Attempted to access file outside of configuration manager!");
173  return resolved;
174  }
175 
177  public async Task<IReadOnlyList<ConfigurationFile>> ListDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
178  {
179  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
180  var path = ValidateConfigRelativePath(configurationRelativePath);
181 
182  if (configurationRelativePath == null)
183  configurationRelativePath = "/";
184 
185  List<ConfigurationFile> result = new List<ConfigurationFile>();
186 
187  void ListImpl()
188  {
189  var enumerator = synchronousIOManager.GetDirectories(path, cancellationToken);
190  try
191  {
192  result.AddRange(enumerator.Select(x => new ConfigurationFile
193  {
194  IsDirectory = true,
195  Path = ioManager.ConcatPath(configurationRelativePath, x),
196  }));
197  }
198  catch (IOException e)
199  {
200  logger.LogDebug("IOException while writing {0}: {1}", path, e);
201  result = null;
202  return;
203  }
204  enumerator = synchronousIOManager.GetFiles(path, cancellationToken);
205  result.AddRange(enumerator.Select(x => new ConfigurationFile
206  {
207  IsDirectory = false,
208  Path = ioManager.ConcatPath(configurationRelativePath, x),
209  }));
210  }
211 
212  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
213  if (systemIdentity == null)
214  ListImpl();
215  else
216  await systemIdentity.RunImpersonated(ListImpl, cancellationToken).ConfigureAwait(false);
217 
218  return result;
219  }
220 
222  public async Task<ConfigurationFile> Read(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
223  {
224  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
225  var path = ValidateConfigRelativePath(configurationRelativePath);
226 
227  ConfigurationFile result = null;
228 
229  void ReadImpl()
230  {
231  lock (this)
232  try
233  {
234  var content = synchronousIOManager.ReadFile(path);
235  string sha1String;
236 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
237  using (var sha1 = new SHA1Managed())
238 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
239  sha1String = String.Join("", sha1.ComputeHash(content).Select(b => b.ToString("x2", CultureInfo.InvariantCulture)));
240  result = new ConfigurationFile
241  {
242  Content = content,
243  IsDirectory = false,
244  LastReadHash = sha1String,
245  AccessDenied = false,
246  Path = configurationRelativePath
247  };
248  }
249  catch (UnauthorizedAccessException)
250  {
251  //this happens on windows, dunno about linux
252  bool isDirectory;
253  try
254  {
255  isDirectory = synchronousIOManager.IsDirectory(path);
256  }
257  catch
258  {
259  isDirectory = false;
260  }
261 
262  result = new ConfigurationFile
263  {
264  Path = configurationRelativePath
265  };
266  if (!isDirectory)
267  result.AccessDenied = true;
268  else
269  result.IsDirectory = true;
270  }
271  }
272 
273  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
274  if (systemIdentity == null)
275  await Task.Factory.StartNew(ReadImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
276  else
277  await systemIdentity.RunImpersonated(ReadImpl, cancellationToken).ConfigureAwait(false);
278 
279  return result;
280  }
281 
283  public async Task SymlinkStaticFilesTo(string destination, CancellationToken cancellationToken)
284  {
285  async Task<IReadOnlyList<string>> GetIgnoreFiles()
286  {
287  var ignoreFileBytes = await ioManager.ReadAllBytes(StaticIgnorePath(), cancellationToken).ConfigureAwait(false);
288  var ignoreFileText = Encoding.UTF8.GetString(ignoreFileBytes);
289 
290  var results = new List<string> { StaticIgnoreFile };
291 
292  //we don't want to lose trailing whitespace on linux
293  using (var reader = new StringReader(ignoreFileText))
294  {
295  cancellationToken.ThrowIfCancellationRequested();
296  var line = await reader.ReadLineAsync().ConfigureAwait(false);
297  if (!String.IsNullOrEmpty(line))
298  results.Add(line);
299  }
300 
301  return results;
302  };
303 
304  IReadOnlyList<string> ignoreFiles;
305 
306  async Task SymlinkBase(bool files)
307  {
308  Task<IReadOnlyList<string>> task;
309  if (files)
310  task = ioManager.GetFiles(GameStaticFilesSubdirectory, cancellationToken);
311  else
312  task = ioManager.GetDirectories(GameStaticFilesSubdirectory, cancellationToken);
313  var entries = await task.ConfigureAwait(false);
314 
315  await Task.WhenAll(entries.Select(async x =>
316  {
317  var fileName = ioManager.GetFileName(x);
318 
319  bool ignored;
320  if (platformIdentifier.IsWindows)
321  //need to normalize
322  ignored = ignoreFiles.Any(y => fileName.ToUpperInvariant() == y.ToUpperInvariant());
323  else
324  ignored = ignoreFiles.Any(y => fileName == y);
325 
326  if (ignored)
327  {
328  logger.LogTrace("Ignoring static file {0}...", fileName);
329  return;
330  }
331 
332  var destPath = ioManager.ConcatPath(destination, fileName);
333  logger.LogTrace("Symlinking {0} to {1}...", x, destPath);
334  var fileExistsTask = ioManager.FileExists(destPath, cancellationToken);
335  if (await ioManager.DirectoryExists(destPath, cancellationToken).ConfigureAwait(false))
336  await ioManager.DeleteDirectory(destPath, cancellationToken).ConfigureAwait(false);
337  var fileExists = await fileExistsTask.ConfigureAwait(false);
338  if (fileExists)
339  await ioManager.DeleteFile(destPath, cancellationToken).ConfigureAwait(false);
340  await symlinkFactory.CreateSymbolicLink(ioManager.ResolvePath(x), ioManager.ResolvePath(destPath), cancellationToken).ConfigureAwait(false);
341  })).ConfigureAwait(false);
342  }
343 
344  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
345  {
346  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
347  ignoreFiles = await GetIgnoreFiles().ConfigureAwait(false);
348  await Task.WhenAll(SymlinkBase(true), SymlinkBase(false)).ConfigureAwait(false);
349  }
350  }
351 
353  public async Task<ConfigurationFile> Write(string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)
354  {
355  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
356  var path = ValidateConfigRelativePath(configurationRelativePath);
357 
358  ConfigurationFile result = null;
359 
360  void WriteImpl()
361  {
362  lock (this)
363  try
364  {
365  var fileHash = previousHash;
366  var success = synchronousIOManager.WriteFileChecked(path, data, ref fileHash, cancellationToken);
367  if (!success)
368  return;
369  if (data != null)
370  postWriteHandler.HandleWrite(path);
371  result = new ConfigurationFile
372  {
373  Content = data,
374  IsDirectory = false,
375  LastReadHash = fileHash,
376  AccessDenied = false,
377  Path = configurationRelativePath
378  };
379  }
380  catch (UnauthorizedAccessException)
381  {
382  //this happens on windows, dunno about linux
383  bool isDirectory;
384  try
385  {
386  isDirectory = synchronousIOManager.IsDirectory(path);
387  }
388  catch
389  {
390  isDirectory = false;
391  }
392 
393  result = new ConfigurationFile
394  {
395  Path = configurationRelativePath
396  };
397  if (!isDirectory)
398  result.AccessDenied = true;
399  else
400  result.IsDirectory = true;
401  }
402  }
403 
404  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
405  if (systemIdentity == null)
406  await Task.Factory.StartNew(WriteImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
407  else
408  await systemIdentity.RunImpersonated(WriteImpl, cancellationToken).ConfigureAwait(false);
409 
410  return result;
411  }
412 
414  public async Task<bool> CreateDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
415  {
416  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
417  var path = ValidateConfigRelativePath(configurationRelativePath);
418 
419  bool? result = null;
420  void DoCreate() => result = synchronousIOManager.CreateDirectory(path, cancellationToken);
421 
422  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
423  if (systemIdentity == null)
424  await Task.Factory.StartNew(DoCreate, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
425  else
426  await systemIdentity.RunImpersonated(DoCreate, cancellationToken).ConfigureAwait(false);
427 
428  return result.Value;
429  }
430 
432  public Task StartAsync(CancellationToken cancellationToken) => EnsureDirectories(cancellationToken);
433 
435  public Task StopAsync(CancellationToken cancellationToken) => EnsureDirectories(cancellationToken);
436 
438  public async Task<bool> HandleEvent(EventType eventType, IEnumerable<string> parameters, CancellationToken cancellationToken)
439  {
440  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
441 
442  if (!EventTypeScriptFileNameMap.TryGetValue(eventType, out var scriptName))
443  return true;
444 
445  //always execute in serial
446  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
447  {
448  var files = await ioManager.GetFilesWithExtension(EventScriptsSubdirectory, platformIdentifier.ScriptFileExtension, cancellationToken).ConfigureAwait(false);
449  var resolvedScriptsDir = ioManager.ResolvePath(EventScriptsSubdirectory);
450 
451  foreach (var I in files.Select(x => ioManager.GetFileName(x)).Where(x => x.StartsWith(scriptName, StringComparison.Ordinal)))
452  using (var script = processExecutor.LaunchProcess(ioManager.ConcatPath(resolvedScriptsDir, I), resolvedScriptsDir, String.Join(' ', parameters), noShellExecute: true))
453  using (cancellationToken.Register(() => script.Terminate()))
454  {
455  var exitCode = await script.Lifetime.ConfigureAwait(false);
456  cancellationToken.ThrowIfCancellationRequested();
457  if (exitCode != 0)
458  return false;
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  return result;
481  }
482  }
483 }
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
+
+
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
+
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
+ + +
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
+ +
readonly IProcessExecutor processExecutor
The IProcessExecutor for Configuration
+
bool IsDirectory
If Path represents a directory
+ +
readonly ILogger< Configuration > logger
The ILogger for Configuration
+
async Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+ +
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for Configuration
+
For accessing the disk in a synchronous manner
+
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
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
For managing the Configuration directory
+ +
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for Configuration
+
bool AccessDenied
If access to the ConfigurationFile file was denied for the operation
+ + + +
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
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ + + +
+ + + + diff --git a/_configuration_client_8cs.html b/_configuration_client_8cs.html new file mode 100644 index 0000000000..b31542845d --- /dev/null +++ b/_configuration_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ConfigurationClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationClient.cs File Reference
+
+ + + + + diff --git a/_configuration_client_8cs_source.html b/_configuration_client_8cs_source.html new file mode 100644 index 0000000000..fbba812d79 --- /dev/null +++ b/_configuration_client_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client.Components
9 {
12  {
20  readonly Instance instance;
21 
27  static string SanitizeGetPath(string path)
28  {
29  if (path == null)
30  path = String.Empty;
31  if (path.Length == 0 || path[0] != '/')
32  path = '/' + path;
33  return path;
34  }
35 
41  public ConfigurationClient(IApiClient apiClient, Instance instance)
42  {
43  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
44  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
45  }
46 
48  public Task DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken) => apiClient.Delete(Routes.Configuration, directory, instance.Id, cancellationToken);
49 
51  public Task<ConfigurationFile> CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken) => apiClient.Create<ConfigurationFile, ConfigurationFile>(Routes.Configuration, directory, instance.Id, cancellationToken);
52 
54  public Task<IReadOnlyList<ConfigurationFile>> List(string directory, CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ConfigurationFile>>(Routes.List(Routes.Configuration) + SanitizeGetPath(directory), instance.Id, cancellationToken);
55 
57  public Task<ConfigurationFile> Read(ConfigurationFile file, CancellationToken cancellationToken)
58  {
59  if (file == null)
60  throw new ArgumentNullException(nameof(file));
61  return apiClient.Read<ConfigurationFile>(Routes.ConfigurationFile + SanitizeGetPath(file.Path), instance.Id, cancellationToken);
62  }
63 
65  public Task<ConfigurationFile> Write(ConfigurationFile file, CancellationToken cancellationToken) => apiClient.Update<ConfigurationFile, ConfigurationFile>(Routes.Configuration, file ?? throw new ArgumentNullException(nameof(file)), instance.Id, cancellationToken);
66  }
67 }
const string Configuration
The Models.ConfigurationFile controller
Definition: Routes.cs:49
+ + + +
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
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
ConfigurationClient(IApiClient apiClient, Instance instance)
Construct a ConfigurationClient
+
Metadata about a server instance
Definition: Instance.cs:9
+ + +
static string List(string route)
Get the /List postfix for a route
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
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..a658d38432 --- /dev/null +++ b/_configuration_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ConfigurationController.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationController.cs File Reference
+
+ + + + + diff --git a/_configuration_controller_8cs_source.html b/_configuration_controller_8cs_source.html new file mode 100644 index 0000000000..54dd0bc033 --- /dev/null +++ b/_configuration_controller_8cs_source.html @@ -0,0 +1,144 @@ + + + + + + +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 
16 namespace Tgstation.Server.Host.Controllers
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  {
56  if (Instance.ConfigurationType == ConfigurationType.Disallowed || (Instance.ConfigurationType == ConfigurationType.SystemIdentityWrite && AuthenticationContext.SystemIdentity == null) || (path != null && ioManager.PathContainsParentAccess(path)))
57  {
58  systemIdentityToUse = null;
59  return true;
60  }
61  systemIdentityToUse = Instance.ConfigurationType == ConfigurationType.SystemIdentityWrite ? AuthenticationContext.SystemIdentity : null;
62  return false;
63  }
64 
66  [TgsAuthorize(ConfigurationRights.Write)]
67  public override async Task<IActionResult> Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
68  {
69  if (model == null)
70  throw new ArgumentNullException(nameof(model));
71  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
72  return Forbid();
73 
74  var config = instanceManager.GetInstance(Instance).Configuration;
75  try
76  {
77  var newFile = await config.Write(model.Path, systemIdentity, model.Content, model.LastReadHash, cancellationToken).ConfigureAwait(false);
78  if (newFile == null)
79  return Conflict(new ErrorMessage
80  {
81  Message = "This file has been updated since you last viewed it!"
82  });
83 
84  newFile.Content = null;
85 
86  return model.LastReadHash == null ? (IActionResult)StatusCode((int)HttpStatusCode.Created, newFile) : Json(newFile);
87  }
88  catch(IOException e)
89  {
90  Logger.LogInformation("IOException while updating file {0}: {1}", model.Path, e);
91  return Conflict(new ErrorMessage
92  {
93  Message = e.Message
94  });
95  }
96  catch (NotImplementedException)
97  {
98  return StatusCode((int)HttpStatusCode.NotImplemented);
99  }
100  }
101 
108  [HttpGet(Routes.File + "/{*filePath}")]
109  [TgsAuthorize(ConfigurationRights.Read)]
110  public async Task<IActionResult> File(string filePath, CancellationToken cancellationToken)
111  {
112  if (ForbidDueToModeConflicts(filePath, out var systemIdentity))
113  return Forbid();
114 
115  try
116  {
117  var result = await instanceManager.GetInstance(Instance).Configuration.Read(filePath, systemIdentity, cancellationToken).ConfigureAwait(false);
118  if (result == null)
119  return StatusCode((int)HttpStatusCode.Gone);
120 
121  return Json(result);
122  }
123  catch (IOException e)
124  {
125  Logger.LogInformation("IOException while reading file {0}: {1}", filePath, e);
126  return Conflict(new ErrorMessage
127  {
128  Message = e.Message
129  });
130  }
131  catch (NotImplementedException)
132  {
133  return StatusCode((int)HttpStatusCode.NotImplemented);
134  }
135  }
136 
143  [HttpGet("List/{*directoryPath}")]
144  [TgsAuthorize(ConfigurationRights.List)]
145  public async Task<IActionResult> Directory(string directoryPath, CancellationToken cancellationToken)
146  {
147  if (ForbidDueToModeConflicts(directoryPath, out var systemIdentity))
148  return Forbid();
149 
150  try
151  {
152  var result = await instanceManager.GetInstance(Instance).Configuration.ListDirectory(directoryPath, systemIdentity, cancellationToken).ConfigureAwait(false);
153  if (result == null)
154  return StatusCode((int)HttpStatusCode.Gone);
155 
156  return Json(result);
157  }
158  catch (NotImplementedException)
159  {
160  return StatusCode((int)HttpStatusCode.NotImplemented);
161  }
162  catch (UnauthorizedAccessException)
163  {
164  return Forbid();
165  }
166  }
167 
169  [TgsAuthorize(ConfigurationRights.List)]
170  public override Task<IActionResult> List(CancellationToken cancellationToken) => Directory(null, cancellationToken);
171 
173  [TgsAuthorize(ConfigurationRights.Write)]
174  public override async Task<IActionResult> Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
175  {
176  if (model == null)
177  throw new ArgumentNullException(nameof(model));
178 
179  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
180  return Forbid();
181 
182  try
183  {
184  model.IsDirectory = true;
185  return await instanceManager.GetInstance(Instance).Configuration.CreateDirectory(model.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Json(model) : StatusCode((int)HttpStatusCode.Created, model);
186  }
187  catch (NotImplementedException)
188  {
189  return StatusCode((int)HttpStatusCode.NotImplemented);
190  }
191  catch (UnauthorizedAccessException)
192  {
193  return Forbid();
194  }
195  }
196 
203  [HttpDelete]
204  [TgsAuthorize(ConfigurationRights.Delete)]
205  public async Task<IActionResult> Delete([FromBody] ConfigurationFile directory, CancellationToken cancellationToken)
206  {
207  if (directory == null)
208  throw new ArgumentNullException(nameof(directory));
209 
210  if (ForbidDueToModeConflicts(directory.Path, out var systemIdentity))
211  return Forbid();
212 
213  try
214  {
215  return await instanceManager.GetInstance(Instance).Configuration.DeleteDirectory(directory.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Ok() : Conflict(new ErrorMessage
216  {
217  Message = "Directory not empty!"
218  });
219  }
220  catch (NotImplementedException)
221  {
222  return StatusCode((int)HttpStatusCode.NotImplemented);
223  }
224  catch (UnauthorizedAccessException)
225  {
226  return Forbid();
227  }
228  }
229  }
230 }
+ +
ConfigurationRights
Rights for Models.ConfigurationFile
+ +
const string Configuration
The Models.ConfigurationFile controller
Definition: Routes.cs:49
+ + +
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
+
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
+ +
Metadata about a server instance
Definition: Instance.cs:9
+ + +
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)
+ + +
ConfigurationType ConfigurationType
If ConfigurationFile can be used on the Instance
Definition: Instance.cs:38
+
+ + + + diff --git a/_configuration_file_8cs.html b/_configuration_file_8cs.html new file mode 100644 index 0000000000..cd2db9fa77 --- /dev/null +++ b/_configuration_file_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Models
 
+
+ + + + diff --git a/_configuration_file_8cs_source.html b/_configuration_file_8cs_source.html new file mode 100644 index 0000000000..a2b122dded --- /dev/null +++ b/_configuration_file_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
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  public byte[] Content { get; set; }
32  }
33 }
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+ +
+ + + + diff --git a/_configuration_rights_8cs.html b/_configuration_rights_8cs.html new file mode 100644 index 0000000000..8717c40ce4 --- /dev/null +++ b/_configuration_rights_8cs.html @@ -0,0 +1,128 @@ + + + + + + +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..61c6172dd7 --- /dev/null +++ b/_configuration_rights_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum ConfigurationRights : ulong
10  {
14  None = 0,
18  Read = 1,
22  Write = 2,
26  List = 4,
30  Delete = 8
31  }
32 }
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..369ed5024a --- /dev/null +++ b/_configuration_test_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/ConfigurationTest.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationTest.cs File Reference
+
+ + + + + diff --git a/_configuration_test_8cs_source.html b/_configuration_test_8cs_source.html new file mode 100644 index 0000000000..c4e78e34cc --- /dev/null +++ b/_configuration_test_8cs_source.html @@ -0,0 +1,123 @@ + + + + + + +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 
11 namespace Tgstation.Server.Tests.Instance
12 {
13  sealed class ConfigurationTest
14  {
16  readonly Api.Models.Instance instance;
17 
18  public ConfigurationTest(IConfigurationClient configurationClient, Api.Models.Instance instance)
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 }
+ + + + + + + +
string Path
The path to the ConfigurationFile file
+ +
async Task TestDeleteDirectory(CancellationToken cancellationToken)
+
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
+
Metadata about a server instance
Definition: Instance.cs:9
+ + + +
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..efda222835 --- /dev/null +++ b/_configuration_type_8cs.html @@ -0,0 +1,123 @@ + + + + + + +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..4698efdedf --- /dev/null +++ b/_configuration_type_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
2 {
6  public enum ConfigurationType
7  {
11  Disallowed,
15  HostWrite,
20  }
21 }
+
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..a5f44ec4f4 --- /dev/null +++ b/_conflict_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_conflict_exception_8cs_source.html b/_conflict_exception_8cs_source.html new file mode 100644 index 0000000000..0539cedea4 --- /dev/null +++ b/_conflict_exception_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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_2_program_8cs.html b/_console_2_program_8cs.html new file mode 100644 index 0000000000..587ea73d1d --- /dev/null +++ b/_console_2_program_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Console
 
+
+ + + + diff --git a/_console_2_program_8cs_source.html b/_console_2_program_8cs_source.html new file mode 100644 index 0000000000..f19e9a9e45 --- /dev/null +++ b/_console_2_program_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Console
9 {
13  static class Program
14  {
18  internal static IWatchdogFactory WatchdogFactory { get; set; } = new WatchdogFactory();
19 
25  internal static async Task Main(string[] args)
26  {
27  using (var loggerFactory = new LoggerFactory())
28  {
29  var arguments = new List<string>(args);
30  var trace = arguments.Remove("--trace-host-watchdog");
31  var debug = arguments.Remove("--debug-host-watchdog");
32 
33  loggerFactory.AddConsole(trace ? LogLevel.Trace : debug ? LogLevel.Debug : LogLevel.Information, true);
34 
35  if (trace && debug)
36  {
37  loggerFactory.CreateLogger(nameof(Program)).LogCritical("Please specify only 1 of --trace-host-watchdog or --debug-host-watchdog!");
38  return;
39  }
40  using (var cts = new CancellationTokenSource())
41  {
42  void AppDomainHandler(object a, EventArgs b) => cts.Cancel();
43  AppDomain.CurrentDomain.ProcessExit += AppDomainHandler;
44  try
45  {
46  System.Console.CancelKeyPress += (a, b) =>
47  {
48  b.Cancel = true;
49  cts.Cancel();
50  };
51  await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(false, arguments.ToArray(), cts.Token).ConfigureAwait(false);
52  }
53  finally
54  {
55  AppDomain.CurrentDomain.ProcessExit -= AppDomainHandler;
56  }
57  }
58  }
59  }
60  }
61 }
Contains the entrypoint for the application
Definition: Program.cs:13
+ +
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+ +
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+ + + + + + +
+ + + + diff --git a/_console_8cs.html b/_console_8cs.html new file mode 100644 index 0000000000..d0f341d5c6 --- /dev/null +++ b/_console_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host.IO
 
+
+ + + + diff --git a/_console_8cs_source.html b/_console_8cs_source.html new file mode 100644 index 0000000000..8636868e7f --- /dev/null +++ b/_console_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.IO
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  {
23  CheckAvailable();
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
31  CheckAvailable();
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') // KeyChar == '\u0000' if the key pressed does not correspond to a printable character, e.g. F1, Pause-Break, etc
50  {
51  passwordBuilder.Append(keyDescription.KeyChar);
52  System.Console.Write('*');
53  }
54  }
55  while (!cancellationToken.IsCancellationRequested);
56  cancellationToken.ThrowIfCancellationRequested();
57  System.Console.WriteLine();
58  return passwordBuilder.ToString();
59  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
60 
62  public Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
63  {
64  CheckAvailable();
65  if (text == null)
66  {
67  if (!newLine)
68  throw new InvalidOperationException("Cannot write null text without a new line!");
69  System.Console.WriteLine();
70  }
71  else if (newLine)
72  System.Console.WriteLine(text);
73  else
74  System.Console.Write(text);
75  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
76  }
77 }
+ +
Abstraction for System.Console
Definition: IConsole.cs:9
+ + + +
+ + + + diff --git a/_constants_8cs.html b/_constants_8cs.html new file mode 100644 index 0000000000..b6134f2859 --- /dev/null +++ b/_constants_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/Constants.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Constants.cs File Reference
+
+ + + + + diff --git a/_constants_8cs_source.html b/_constants_8cs_source.html new file mode 100644 index 0000000000..3f8bdfd448 --- /dev/null +++ b/_constants_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components.Interop
2 {
3  static class Constants
4  {
5  //interop values, match them up with the appropriate api.dm
6 
7  //api version 4.0.0.0
8  public const string DMParamHostVersion = "server_service_version";
9  public const string DMParamInfoJson = "tgs_json";
10 
11  public const string DMInteropAccessIdentifier = "tgs_tok";
12 
13  public const string DMResponseSuccess = "tgs_succ";
14 
15  public const string DMTopicChangePort = "tgs_port";
16  public const string DMTopicChangeReboot = "tgs_rmode";
17  public const string DMTopicChatCommand = "tgs_chat_comm";
18  public const string DMTopicEvent = "tgs_event";
19  public const string DMTopicInteropResponse = "tgs_interop";
20 
21  public const string DMCommandNewPort = "tgs_new_port";
22  public const string DMCommandApiValidate = "tgs_validate";
23  public const string DMCommandServerPrimed = "tgs_prime";
24  public const string DMCommandWorldReboot = "tgs_reboot";
25  public const string DMCommandEndProcess = "tgs_kill";
26  public const string DMCommandChat = "tgs_chat_send";
27 
28  public const string DMParameterCommand = "tgs_com";
29  public const string DMParameterData = "tgs_data";
30  }
31 }
+ + +
+ + + + diff --git a/_credentials_provider_8cs.html b/_credentials_provider_8cs.html new file mode 100644 index 0000000000..fc7f9b1bf7 --- /dev/null +++ b/_credentials_provider_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..7c4be29797 --- /dev/null +++ b/_credentials_provider_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Components.Repository
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 }
+ +
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..72a52d6b8b --- /dev/null +++ b/_cryptography_suite_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/CryptographySuite.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CryptographySuite.cs File Reference
+
+ + + + + diff --git a/_cryptography_suite_8cs_source.html b/_cryptography_suite_8cs_source.html new file mode 100644 index 0000000000..ab91342cd2 --- /dev/null +++ b/_cryptography_suite_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + +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.Security.Cryptography;
5 
6 namespace Tgstation.Server.Host.Security
7 {
10  {
14  const uint SecureStringLength = 30;
15 
19  readonly IPasswordHasher<User> passwordHasher;
20 
25  public CryptographySuite(IPasswordHasher<User> passwordHasher)
26  {
27  this.passwordHasher = passwordHasher ?? throw new ArgumentNullException(nameof(passwordHasher));
28  }
29 
31  public byte[] GetSecureBytes(uint amount)
32  {
33  using (var rng = new RNGCryptoServiceProvider())
34  {
35  var byt = new byte[amount];
36  rng.GetBytes(byt);
37  return byt;
38  }
39  }
40 
42  public void SetUserPassword(User user, string newPassword, bool newUser)
43  {
44  if (user == null)
45  throw new ArgumentNullException(nameof(user));
46  if (newPassword == null)
47  throw new ArgumentNullException(nameof(newPassword));
48  user.PasswordHash = passwordHasher.HashPassword(user, newPassword);
49  if (!newUser)
50  user.LastPasswordUpdate = DateTimeOffset.Now;
51  }
52 
54  public bool CheckUserPassword(User user, string password)
55  {
56  switch (passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password))
57  {
58  case PasswordVerificationResult.Failed:
59  return false;
60  case PasswordVerificationResult.SuccessRehashNeeded:
61  SetUserPassword(user, password, false);
62  break;
63  }
64  return true;
65  }
66 
68  public string GetSecureString() => Convert.ToBase64String(GetSecureBytes(SecureStringLength));
69  }
70 }
string PasswordHash
The hash of the user&#39;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
+
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
Contains various cryptographic functions
+ +
bool CheckUserPassword(User user, string password)
Checks a given password matches a given user &#39;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..1f9a722e1e --- /dev/null +++ b/_custom_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..409fa25217 --- /dev/null +++ b/_custom_command_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Chat.Commands
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 
32  public void SetHandler(ICustomCommandHandler handler)
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..708af11087 --- /dev/null +++ b/_d_b_connection_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/DBConnectionFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DBConnectionFactory.cs File Reference
+
+ + + + + diff --git a/_d_b_connection_factory_8cs_source.html b/_d_b_connection_factory_8cs_source.html new file mode 100644 index 0000000000..4738430f50 --- /dev/null +++ b/_d_b_connection_factory_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Core
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..3c0ea6e2bd --- /dev/null +++ b/_database_configuration_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Configuration
 
+
+ + + + diff --git a/_database_configuration_8cs_source.html b/_database_configuration_8cs_source.html new file mode 100644 index 0000000000..c92d40e674 --- /dev/null +++ b/_database_configuration_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Configuration
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 }
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ + +
+ + + + diff --git a/_database_context_8cs.html b/_database_context_8cs.html new file mode 100644 index 0000000000..c6ab7e33b6 --- /dev/null +++ b/_database_context_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DatabaseContext.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseContext.cs File Reference
+
+ + + + + diff --git a/_database_context_8cs_source.html b/_database_context_8cs_source.html new file mode 100644 index 0000000000..a520b8de9c --- /dev/null +++ b/_database_context_8cs_source.html @@ -0,0 +1,132 @@ + + + + + + +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.Extensions.Logging;
3 using Microsoft.Extensions.Options;
4 using System;
5 using System.Linq;
6 using System.Threading;
7 using System.Threading.Tasks;
9 
10 namespace Tgstation.Server.Host.Models
11 {
13  abstract class DatabaseContext<TParentContext> : DbContext, IDatabaseContext where TParentContext : DbContext
14  {
16  public DbSet<User> Users { get; set; }
17 
19  public DbSet<Instance> Instances { get; set; }
20 
22  public DbSet<CompileJob> CompileJobs { get; set; }
23 
25  public DbSet<RevisionInformation> RevisionInformations { get; set; }
26 
28  public DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
29 
31  public DbSet<ChatBot> ChatBots { get; set; }
32 
34  public DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
35 
37  public DbSet<RepositorySettings> RepositorySettings { get; set; }
38 
40  public DbSet<InstanceUser> InstanceUsers { get; set; }
41 
43  public DbSet<ChatChannel> ChatChannels { get; set; }
44 
46  public DbSet<Job> Jobs { get; set; }
47 
49  public DbSet<ReattachInformation> ReattachInformations { get; set; }
50 
52  public DbSet<WatchdogReattachInformation> WatchdogReattachInformations { get; set; }
53 
57  public DbSet<TestMerge> TestMerges { get; set; }
58 
62  public DbSet<RevInfoTestMerge> RevInfoTestMerges { get; set; }
63 
67  protected ILogger Logger { get; }
68 
73 
78 
86  public DatabaseContext(DbContextOptions<TParentContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions)
87  {
88  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
89  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
90  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
91  }
92 
94  protected override void OnModelCreating(ModelBuilder modelBuilder)
95  {
96  Logger.LogTrace("Building entity framework context...");
97  base.OnModelCreating(modelBuilder);
98 
99  var userModel = modelBuilder.Entity<User>();
100  userModel.HasIndex(x => x.CanonicalName).IsUnique();
101  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
102 
103  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
104 
105  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.Cascade);
106 
107  var revInfo = modelBuilder.Entity<RevisionInformation>();
108  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
109  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
110  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Restrict);
111  revInfo.HasIndex(x => x.CommitSha).IsUnique();
112 
113  modelBuilder.Entity<CompileJob>().HasIndex(x => x.DirectoryName);
114 
115  modelBuilder.Entity<Job>().HasOne<CompileJob>().WithOne(x => x.Job).OnDelete(DeleteBehavior.Restrict);
116 
117  var chatChannel = modelBuilder.Entity<ChatChannel>();
118  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
119  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
120  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
121 
122  modelBuilder.Entity<ChatBot>().HasIndex(x => x.Name).IsUnique();
123 
124  var instanceModel = modelBuilder.Entity<Instance>();
125  instanceModel.HasIndex(x => x.Path).IsUnique();
126  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
127  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
128  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
129  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
130  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
131  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
132  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
133  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
134  }
135 
137  public async Task Initialize(CancellationToken cancellationToken)
138  {
140  {
141  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
142  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
143  }
144 
145  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
146  var wasEmpty = !migrations.Any();
147 
148  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
149  {
150  Logger.LogInformation("Migrating database...");
151  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
152  }
153  else
154  Logger.LogDebug("No migrations to apply.");
155 
156  wasEmpty |= (await Users.CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
157 
158  if (wasEmpty)
159  {
160  Logger.LogInformation("Seeding database...");
161  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
162  }
164  {
165  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
166  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
167  }
168  }
169 
171  public Task Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
172  }
173 }
+ + + + + + +
For initially seeding a database
+ + +
async Task Initialize(CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext
+ +
bool ResetAdminPassword
If the admin user should be enabled and have it&#39;s password reset
+
override void OnModelCreating(ModelBuilder modelBuilder)
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ + +
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
Construct a DatabaseContext<TParentContext>
+ +
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>
+ + + + + + +
+ + + + diff --git a/_database_context_factory_8cs.html b/_database_context_factory_8cs.html new file mode 100644 index 0000000000..f62a6b31d3 --- /dev/null +++ b/_database_context_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/DatabaseContextFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseContextFactory.cs File Reference
+
+ + + + + diff --git a/_database_context_factory_8cs_source.html b/_database_context_factory_8cs_source.html new file mode 100644 index 0000000000..881b5085cb --- /dev/null +++ b/_database_context_factory_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Core
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..b5c1ed5fe5 --- /dev/null +++ b/_database_seeder_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DatabaseSeeder.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseSeeder.cs File Reference
+
+ + + + + diff --git a/_database_seeder_8cs_source.html b/_database_seeder_8cs_source.html new file mode 100644 index 0000000000..9397fae594 --- /dev/null +++ b/_database_seeder_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Models
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&#39;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
+ +
InstanceManagerRights
Rights for managing Models.Instances
+
void SeedAdminUser(IDatabaseContext databaseContext)
Add a default admin User to a given databaseContext
+ + + + + + +
+ + + + diff --git a/_database_type_8cs.html b/_database_type_8cs.html new file mode 100644 index 0000000000..9c421a7fbf --- /dev/null +++ b/_database_type_8cs.html @@ -0,0 +1,123 @@ + + + + + + +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..81d9a27a92 --- /dev/null +++ b/_database_type_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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..30fb0716d3 --- /dev/null +++ b/_dead_session_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/DeadSessionController.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DeadSessionController.cs File Reference
+
+ + + + + diff --git a/_dead_session_controller_8cs_source.html b/_dead_session_controller_8cs_source.html new file mode 100644 index 0000000000..9e484af7e1 --- /dev/null +++ b/_dead_session_controller_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Watchdog
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  Dmb.Dispose();
76  }
77 
79  public void EnableCustomChatCommands() => throw new NotSupportedException();
80 
82  public ReattachInformation Release() => throw new NotSupportedException();
83 
85  public void ResetRebootState() => throw new NotSupportedException();
86 
88  public Task<string> SendCommand(string command, CancellationToken cancellationToken) => throw new NotSupportedException();
89 
91  public void SetHighPriority() => throw new NotSupportedException();
92 
94  public Task<bool> SetPort(ushort newPort, CancellationToken cancellatonToken) => throw new NotSupportedException();
95 
97  public Task<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken) => throw new NotSupportedException();
98  }
99 }
Represents the result of trying to start a DD process
Definition: LaunchResult.cs:9
+ + +
Handles communication with a DreamDaemon IProcess
+ + +
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..62586b1c0b --- /dev/null +++ b/_default_i_o_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..8725a40dd1 --- /dev/null +++ b/_default_i_o_manager_8cs_source.html @@ -0,0 +1,118 @@ + + + + + + +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.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
11 
12 namespace Tgstation.Server.Host.IO
13 {
18  {
22  public const int DefaultBufferSize = 4096;
23 
30  static async Task NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)
31  {
32  var tasks = new List<Task>();
33 
34  foreach (var subDir in dir.EnumerateDirectories())
35  {
36  cancellationToken.ThrowIfCancellationRequested();
37  if (!subDir.Attributes.HasFlag(FileAttributes.Directory) || subDir.Attributes.HasFlag(FileAttributes.ReparsePoint))
38  //this is probably a symlink
39  subDir.Delete();
40  else
41  tasks.Add(NormalizeAndDelete(subDir, cancellationToken));
42  }
43  foreach (var file in dir.EnumerateFiles())
44  {
45  cancellationToken.ThrowIfCancellationRequested();
46  file.Attributes = FileAttributes.Normal;
47  file.Delete();
48  }
49  await Task.WhenAll(tasks).ConfigureAwait(false);
50  cancellationToken.ThrowIfCancellationRequested();
51  dir.Delete(true);
52  }
53 
59  static FileStream OpenWriteStream(string path) => new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite, DefaultBufferSize, true);
60 
69  IEnumerable<Task> CopyDirectoryImpl(string src, string dest, IEnumerable<string> ignore, CancellationToken cancellationToken)
70  {
71  var dir = new DirectoryInfo(src);
72  var atLeastOneSubDir = false;
73  foreach (var I in dir.EnumerateDirectories())
74  {
75  if (ignore != null && ignore.Contains(I.Name))
76  continue;
77  foreach (var J in CopyDirectoryImpl(I.FullName, Path.Combine(dest, I.Name), null, cancellationToken))
78  {
79  atLeastOneSubDir = true;
80  yield return J;
81  }
82  }
83 
84  async Task CopyThisDirectory()
85  {
86  if (!atLeastOneSubDir)
87  await CreateDirectory(dest, cancellationToken).ConfigureAwait(false); //save on createdir calls
88 
89  var tasks = new List<Task>();
90 
91  await dir.EnumerateFiles().ToAsyncEnumerable().ForEachAsync(I =>
92  {
93  if (ignore != null && ignore.Contains(I.Name))
94  return;
95  tasks.Add(CopyFile(I.FullName, Path.Combine(dest, I.Name), cancellationToken));
96  }).ConfigureAwait(false);
97 
98  await Task.WhenAll(tasks).ConfigureAwait(false);
99  };
100 
101  yield return CopyThisDirectory();
102  }
103 
105  public async Task CopyDirectory(string src, string dest, IEnumerable<string> ignore, CancellationToken cancellationToken)
106  {
107  if (dest == null)
108  throw new ArgumentNullException(nameof(src));
109  if (dest == null)
110  throw new ArgumentNullException(nameof(src));
111 
112  src = ResolvePath(src);
113  dest = ResolvePath(dest);
114  foreach (var directoryCopy in CopyDirectoryImpl(src, dest, ignore, cancellationToken))
115  await directoryCopy.ConfigureAwait(false);
116  }
117 
119  public async Task AppendAllText(string path, string additional_contents, CancellationToken cancellationToken)
120  {
121  if (additional_contents == null)
122  throw new ArgumentNullException(nameof(additional_contents));
123  using (var destStream = new FileStream(ResolvePath(path), FileMode.Append, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete, DefaultBufferSize, true))
124  {
125  var buf = Encoding.UTF8.GetBytes(additional_contents);
126  await destStream.WriteAsync(buf, 0, buf.Length, cancellationToken).ConfigureAwait(false);
127  }
128  }
129 
131  public string ConcatPath(params string[] paths)
132  {
133  if (paths == null)
134  throw new ArgumentNullException(nameof(paths));
135  return Path.Combine(paths);
136  }
137 
139  public async Task CopyFile(string src, string dest, CancellationToken cancellationToken)
140  {
141  if (src == null)
142  throw new ArgumentNullException(nameof(src));
143  if (dest == null)
144  throw new ArgumentNullException(nameof(dest));
145  using (var srcStream = new FileStream(ResolvePath(src), FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
146  using (var destStream = new FileStream(ResolvePath(dest), FileMode.Create, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete, DefaultBufferSize, true))
147  await srcStream.CopyToAsync(destStream, 81920, cancellationToken).ConfigureAwait(false);
148  }
149 
151  public Task CreateDirectory(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => Directory.CreateDirectory(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
152 
154  public async Task DeleteDirectory(string path, CancellationToken cancellationToken)
155  {
156  path = ResolvePath(path);
157  var di = new DirectoryInfo(path);
158  if (!di.Exists)
159  return;
160  await NormalizeAndDelete(di, cancellationToken).ConfigureAwait(false);
161  }
162 
164  public Task DeleteFile(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => File.Delete(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
165 
167  public Task<bool> FileExists(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => File.Exists(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
168 
170  public Task<bool> DirectoryExists(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => Directory.Exists(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
171 
173  public string GetDirectoryName(string path) => Path.GetDirectoryName(path ?? throw new ArgumentNullException(nameof(path)));
174 
176  public string GetFileName(string path) => Path.GetFileName(path ?? throw new ArgumentNullException(nameof(path)));
177 
179  public string GetFileNameWithoutExtension(string path) => Path.GetFileNameWithoutExtension(path ?? throw new ArgumentNullException(nameof(path)));
180 
182  public Task<List<string>> GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
183  {
184  path = ResolvePath(path);
185  if (extension == null)
186  throw new ArgumentNullException(extension);
187  var results = new List<string>();
188  foreach (var I in Directory.EnumerateFiles(path, String.Format(CultureInfo.InvariantCulture, "*.{0}", extension), SearchOption.TopDirectoryOnly))
189  {
190  cancellationToken.ThrowIfCancellationRequested();
191  results.Add(I);
192  }
193  return results;
194  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
195 
197  public Task MoveFile(string source, string destination, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
198  {
199  if (destination == null)
200  throw new ArgumentNullException(nameof(destination));
201  source = ResolvePath(source ?? throw new ArgumentNullException(nameof(source)));
202  destination = ResolvePath(destination);
203  File.Move(source, destination);
204  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
205 
207  public Task MoveDirectory(string source, string destination, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
208  {
209  if (destination == null)
210  throw new ArgumentNullException(nameof(destination));
211  source = ResolvePath(source ?? throw new ArgumentNullException(nameof(source)));
212  destination = ResolvePath(destination);
213  Directory.Move(source, destination);
214  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
215 
217  public async Task<byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
218  {
219  path = ResolvePath(path);
220  using (var file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
221  {
222  byte[] buf;
223  buf = new byte[file.Length];
224  await file.ReadAsync(buf, 0, (int)file.Length, cancellationToken).ConfigureAwait(false);
225  return buf;
226  }
227  }
228 
230  public virtual string ResolvePath(string path) => Path.GetFullPath(path ?? throw new ArgumentNullException(nameof(path)));
231 
233  public async Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
234  {
235  path = ResolvePath(path);
236  using (var file = OpenWriteStream(path))
237  await file.WriteAsync(contents, 0, contents.Length, cancellationToken).ConfigureAwait(false);
238  }
239 
241  public Task<IReadOnlyList<string>> GetDirectories(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
242  {
243  path = ResolvePath(path);
244  var results = new List<string>();
245  cancellationToken.ThrowIfCancellationRequested();
246  foreach (var I in Directory.EnumerateDirectories(path))
247  {
248  results.Add(I);
249  cancellationToken.ThrowIfCancellationRequested();
250  }
251  return (IReadOnlyList<string>)results;
252  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
253 
255  public Task<IReadOnlyList<string>> GetFiles(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
256  {
257  path = ResolvePath(path);
258  var results = new List<string>();
259  cancellationToken.ThrowIfCancellationRequested();
260  foreach (var I in Directory.EnumerateFiles(path))
261  {
262  results.Add(I);
263  cancellationToken.ThrowIfCancellationRequested();
264  }
265  return (IReadOnlyList<string>)results;
266  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
267 
269  public Task CreateSymlink(string target, string link, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
270  {
271  target = ResolvePath(target);
272  link = ResolvePath(link);
273 
274  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
275 
277  public async Task<byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
278  {
279  //DownloadDataTaskAsync can't be cancelled and is shittily written, don't use it
280  using (var wc = new WebClient())
281  {
282  var tcs = new TaskCompletionSource<byte[]>();
283  wc.DownloadDataCompleted += (a, b) =>
284  {
285  if (b.Error != null)
286  tcs.TrySetException(b.Error);
287  else if (b.Cancelled)
288  tcs.TrySetCanceled();
289  else
290  tcs.TrySetResult(b.Result);
291  };
292  wc.DownloadDataAsync(url);
293  using (cancellationToken.Register(() =>
294  {
295  wc.CancelAsync();
296  tcs.TrySetCanceled();
297  }))
298  return await tcs.Task.ConfigureAwait(false);
299  }
300  }
301 
303  public Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
304  {
305  path = ResolvePath(path);
306  if (zipFileBytes == null)
307  throw new ArgumentNullException(nameof(zipFileBytes));
308 
309  using (var ms = new MemoryStream(zipFileBytes))
310  using (var archive = new ZipArchive(ms, ZipArchiveMode.Read))
311  archive.ExtractToDirectory(path);
312  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
313 
315  public bool PathContainsParentAccess(string path) => path?.Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }).Any(x => x == "..") ?? throw new ArgumentNullException(nameof(path));
316  }
317 }
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
+ +
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
+ +
static async Task NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)
Recursively empty a directory
+
async Task AppendAllText(string path, string additional_contents, CancellationToken cancellationToken)
+
async Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
async Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
IEnumerable< Task > CopyDirectoryImpl(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
async Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
IIOManager that resolves paths to Environment.CurrentDirectory
+
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
+ + + + 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..3bb322f2fc --- /dev/null +++ b/_design_time_db_context_factory_helpers_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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 Models.DatabaseContext<TParentContext>s More...
 
+ + + +

+Namespaces

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..0529fa9dff --- /dev/null +++ b/_design_time_db_context_factory_helpers_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models.Migrations
8 {
13  {
17  const string RootJson = "appsettings.json";
21  const string DevJson = "appsettings.Development.json";
22 
24  public static IOptions<DatabaseConfiguration> GetDbContextOptions()
25  {
26  var builder = new ConfigurationBuilder();
27  builder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
28  builder.AddJsonFile(RootJson);
29  builder.AddJsonFile(DevJson);
30  var configuration = builder.Build();
31  return Options.Create(configuration.GetSection(DatabaseConfiguration.Section).Get<DatabaseConfiguration>());
32  }
33  }
34 }
+ + +
Contains helpers for creating design time Models.DatabaseContext<TParentContext>s ...
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+ +
Configuration options for the Models.DatabaseContext<TParentContext>
+ + + +
+ + + + diff --git a/_discord_connection_string_builder_8cs.html b/_discord_connection_string_builder_8cs.html new file mode 100644 index 0000000000..2a40612ebd --- /dev/null +++ b/_discord_connection_string_builder_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..7816f62480 --- /dev/null +++ b/_discord_connection_string_builder_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
4 namespace Tgstation.Server.Api.Models
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
+ + +
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..d72ad4a6d7 --- /dev/null +++ b/_discord_provider_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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
+
+ + + + + diff --git a/_discord_provider_8cs_source.html b/_discord_provider_8cs_source.html new file mode 100644 index 0000000000..d048c2bbe2 --- /dev/null +++ b/_discord_provider_8cs_source.html @@ -0,0 +1,134 @@ + + + + + + +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 
11 namespace Tgstation.Server.Host.Components.Chat.Providers
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("!", "", 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  }
72 
74  public override void Dispose() => client.Dispose();
75 
81  Task Client_MessageReceived(SocketMessage e)
82  {
83  if (e.Author.Id == client.CurrentUser.Id)
84  return Task.CompletedTask;
85 
86  var pm = e.Channel is IPrivateChannel;
87 
88  if (!pm && !mappedChannels.Contains(e.Channel.Id))
89  return e.MentionedUsers.Any(x => x.Id == client.CurrentUser.Id) ? SendMessage(e.Channel.Id, "I do not respond to this channel!", default) : Task.CompletedTask;
90 
91  var result = new Message
92  {
93  Content = e.Content,
94  User = new User
95  {
96  RealId = e.Author.Id,
97  Channel = new Channel
98  {
99  RealId = e.Channel.Id,
100  IsPrivate = pm,
101  ConnectionName = pm ? e.Author.Username : (e.Channel as ITextChannel)?.Guild.Name ?? "UNKNOWN",
102  FriendlyName = e.Channel.Name
103  //isAdmin and Tag populated by manager
104  },
105  FriendlyName = e.Author.Username,
106  Mention = NormalizeMention(e.Author.Mention)
107  }
108  };
109  EnqueueMessage(result);
110  return Task.CompletedTask;
111  }
112 
114  public override async Task<bool> Connect(CancellationToken cancellationToken)
115  {
116  if (Connected)
117  return true;
118 
119  try
120  {
121  await client.LoginAsync(TokenType.Bot, botToken, true).ConfigureAwait(false);
122 
123  cancellationToken.ThrowIfCancellationRequested();
124 
125  await client.StartAsync().ConfigureAwait(false);
126 
127  var channelsAvailable = new TaskCompletionSource<object>();
128  client.Ready += () =>
129  {
130  channelsAvailable.TrySetResult(null);
131  return Task.CompletedTask;
132  };
133  using (cancellationToken.Register(() => channelsAvailable.SetCanceled()))
134  await channelsAvailable.Task.ConfigureAwait(false);
135  }
136  catch (OperationCanceledException)
137  {
138  throw;
139  }
140  catch (Exception e)
141  {
142  logger.LogWarning("Error connecting to Discord: {0}", e);
143  return false;
144  }
145 
146  return true;
147  }
148 
150  public override async Task Disconnect(CancellationToken cancellationToken)
151  {
152  if (!Connected)
153  return;
154 
155  try
156  {
157  await client.StopAsync().ConfigureAwait(false);
158  cancellationToken.ThrowIfCancellationRequested();
159  await client.LogoutAsync().ConfigureAwait(false);
160  }
161  catch (OperationCanceledException)
162  {
163  throw;
164  }
165  catch (Exception e)
166  {
167  logger.LogWarning("Error disconnecting from discord: {0}", e);
168  }
169  }
170 
172  public override Task<IReadOnlyList<Channel>> MapChannels(IEnumerable<ChatChannel> channels, CancellationToken cancellationToken)
173  {
174  if (channels == null)
175  throw new ArgumentNullException(nameof(channels));
176 
177  if (!Connected)
178  throw new InvalidOperationException("Provider not connected!");
179 
180  Channel GetChannelForChatChannel(ChatChannel channel)
181  {
182  if (!channel.DiscordChannelId.HasValue)
183  throw new InvalidOperationException("ChatChannel missing DiscordChannelId!");
184 
185  if (!(client.GetChannel(channel.DiscordChannelId.Value) is ITextChannel discordChannel))
186  return null;
187 
188  return new Channel
189  {
190  RealId = discordChannel.Id,
191  IsAdmin = channel.IsAdminChannel == true,
192  ConnectionName = discordChannel.Guild.Name,
193  FriendlyName = discordChannel.Name,
194  IsPrivate = false,
195  Tag = channel.Tag
196  };
197  };
198 
199  var enumerator = channels.Select(x => GetChannelForChatChannel(x)).Where(x => x != null).ToList();
200 
201  lock (this)
202  {
203  mappedChannels.Clear();
204  mappedChannels.AddRange(enumerator.Select(x => x.RealId));
205  }
206 
207  return Task.FromResult<IReadOnlyList<Channel>>(enumerator);
208  }
209 
211  public override async Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
212  {
213  try
214  {
215  var channel = client.GetChannel(channelId) as IMessageChannel;
216  await (channel?.SendMessageAsync(message, false, null, new RequestOptions
217  {
218  CancelToken = cancellationToken
219  }) ?? Task.CompletedTask).ConfigureAwait(false);
220  }
221  catch (OperationCanceledException)
222  {
223  throw;
224  }
225  catch (Exception e)
226  {
227  logger.LogWarning("Error sending discord message: {0}", e);
228  }
229  }
230  }
231 }
+
Indicates a chat channel
Definition: ChatChannel.cs:8
+ + + +
override async Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
Send a message to the IProvider
+ + +
Task Client_MessageReceived(SocketMessage e)
Handle a message recieved from Discord
+
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
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
string Tag
A custom tag users can define to group channels together
Definition: ChatChannel.cs:41
+
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
+
ulong DiscordChannelId
The Discord channel ID
Definition: ChatChannel.cs:18
+ +
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: User.cs:15
+
bool IsAdminChannel
If the ChatChannel is an admin channel
Definition: ChatChannel.cs:24
+ + +
+ + + + diff --git a/_dmb_factory_8cs.html b/_dmb_factory_8cs.html new file mode 100644 index 0000000000..e282bb6b7f --- /dev/null +++ b/_dmb_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DmbFactory.cs File Reference
+
+ + + + + diff --git a/_dmb_factory_8cs_source.html b/_dmb_factory_8cs_source.html new file mode 100644 index 0000000000..1f38ff23ba --- /dev/null +++ b/_dmb_factory_8cs_source.html @@ -0,0 +1,140 @@ + + + + + + +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 
12 namespace Tgstation.Server.Host.Components.Compiler
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 
43  readonly ILogger<DmbFactory> logger;
44 
48  readonly Api.Models.Instance instance;
52  readonly CancellationTokenSource cleanupCts;
53 
61  TaskCompletionSource<object> newerDmbTcs;
66 
67  Dictionary<long, int> jobLockCounts;
68 
76  public DmbFactory(IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, ILogger<DmbFactory> logger, Api.Models.Instance instance)
77  {
78  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
79  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
80  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
81  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
82 
83  cleanupTask = Task.CompletedTask;
84  newerDmbTcs = new TaskCompletionSource<object>();
85  cleanupCts = new CancellationTokenSource();
86  jobLockCounts = new Dictionary<long, int>();
87  }
88 
90  public void Dispose() => cleanupCts.Dispose(); //we don't dispose nextDmbProvider here, since it might be the only thing we have
91 
96  void CleanJob(CompileJob job)
97  {
98  async Task HandleCleanup()
99  {
100  var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token);
101  Task otherTask;
102  //lock (this) //already locked below
103  otherTask = cleanupTask;
104  await Task.WhenAll(otherTask, deleteJob).ConfigureAwait(false);
105  }
106  lock (this)
107  {
108  if (!jobLockCounts.TryGetValue(job.Id, out var currentVal) || currentVal == 1)
109  {
110  jobLockCounts.Remove(job.Id);
111  logger.LogDebug("Cleaning compile job {0} => {1}", job.Id, job.DirectoryName);
112  cleanupTask = HandleCleanup();
113  }
114  else
115  {
116  var decremented = --jobLockCounts[job.Id];
117  logger.LogTrace("Compile job {0} lock count now: {1}", job.Id, decremented);
118  }
119  }
120  }
121 
123  public async Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
124  {
125  if (job == null)
126  throw new ArgumentNullException(nameof(job));
127 
128  var newProvider = await FromCompileJob(job, cancellationToken).ConfigureAwait(false);
129  if (newProvider == null)
130  return;
131  lock (this)
132  {
133  nextDmbProvider?.Dispose();
134  nextDmbProvider = newProvider;
135  newerDmbTcs.SetResult(nextDmbProvider);
136  newerDmbTcs = new TaskCompletionSource<object>();
137  }
138  }
139 
141  public IDmbProvider LockNextDmb(int lockCount)
142  {
143  if (!DmbAvailable)
144  throw new InvalidOperationException("No .dmb available!");
145  if (lockCount < 0)
146  throw new ArgumentOutOfRangeException(nameof(lockCount), lockCount, "lockCount must be greater than or equal to 0!");
147  lock (this)
148  {
149  var jobId = nextDmbProvider.CompileJob.Id;
150  var incremented = jobLockCounts[jobId] += lockCount;
151  logger.LogTrace("Compile job {0} lock count now: {1}", jobId, incremented);
152  return nextDmbProvider;
153  }
154  }
155 
157  public Task StartAsync(CancellationToken cancellationToken) => databaseContextFactory.UseContext(async (db) =>
158  {
159  //where complete clause not necessary, only successful COMPILEjobs get in the db
160  var cj = await db.CompileJobs.Where(x => x.Job.Instance.Id == instance.Id)
161  .OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
162  if (cj == default(CompileJob))
163  return;
164  await LoadCompileJob(cj, cancellationToken).ConfigureAwait(false);
165  //we dont do CleanUnusedCompileJobs here because the watchdog may have plans for them yet
166  });
167 
169  public async Task StopAsync(CancellationToken cancellationToken)
170  {
171  using (cancellationToken.Register(() => cleanupCts.Cancel()))
172  await cleanupTask.ConfigureAwait(false);
173  }
174 
176  public async Task<IDmbProvider> FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
177  {
178  if (compileJob == null)
179  throw new ArgumentNullException(nameof(compileJob));
180 
181  //ensure we have the entire compile job tree
182  await databaseContextFactory.UseContext(async db => compileJob = await db.CompileJobs.Where(x => x.Id == compileJob.Id)
183  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
184  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
185  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
186  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false); //can't wait to see that query
187 
188  logger.LogTrace("Loading compile job {0}...", compileJob.Id);
189  var providerSubmitted = false;
190  var newProvider = new DmbProvider(compileJob, ioManager, () =>
191  {
192  if (providerSubmitted)
193  CleanJob(compileJob);
194  });
195 
196  try
197  {
198  var primaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
199  var secondaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
200 
201  if (!(await primaryCheckTask.ConfigureAwait(false) && await secondaryCheckTask.ConfigureAwait(false)))
202  {
203  logger.LogWarning("Error loading compile job, .dmb missing!");
204  return null; //omae wa mou shinderu
205  }
206 
207  lock (this)
208  {
209  if (!jobLockCounts.TryGetValue(compileJob.Id, out int value))
210  {
211  value = 1;
212  jobLockCounts.Add(compileJob.Id, 1);
213  }
214  else
215  jobLockCounts[compileJob.Id] = ++value;
216 
217  logger.LogTrace("Compile job {0} lock count now: {1}", compileJob.Id, value);
218 
219  providerSubmitted = true;
220  return newProvider;
221  }
222  }
223  finally
224  {
225  if (!providerSubmitted)
226  newProvider.Dispose();
227  }
228  }
229 
231  public async Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)
232  {
233  List<long> jobIdsToSkip;
234  //don't clean locked directories
235  lock (this)
236  jobIdsToSkip = jobLockCounts.Select(x => x.Key).ToList();
237 
238  List<string> jobUidsToNotErase = null;
239 
240  //find the uids of locked directories
241  await databaseContextFactory.UseContext(async db =>
242  {
243  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);
244  }).ConfigureAwait(false);
245 
246  //add the other exemption
247  if (exceptThisOne != null)
248  jobUidsToNotErase.Add(exceptThisOne.DirectoryName.Value.ToString().ToUpperInvariant());
249 
250  //cleanup
251  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
252  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
253  int deleting = 0;
254  var tasks = directories.Select(async x =>
255  {
256  var nameOnly = ioManager.GetFileName(x);
257  if (jobUidsToNotErase.Contains(nameOnly.ToUpperInvariant()))
258  return;
259  try
260  {
261  ++deleting;
262  await ioManager.DeleteDirectory(x, cancellationToken).ConfigureAwait(false);
263  }
264  catch (OperationCanceledException)
265  {
266  throw;
267  }
268  catch (Exception e)
269  {
270  logger.LogWarning("Error deleting directory {0}! Exception: {1}", x, e);
271  }
272  }).ToList();
273  if (deleting > 0)
274  {
275  logger.LogDebug("Cleaning {0} unused game folders...", deleting);
276  await Task.WhenAll().ConfigureAwait(false);
277  }
278  }
279  }
280 }
+ +
IDmbProvider nextDmbProvider
The latest DmbProvider
Definition: DmbFactory.cs:65
+
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:57
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+ + + + + +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
async Task StopAsync(CancellationToken cancellationToken)
Definition: DmbFactory.cs:169
+ +
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:39
+ + +
async Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
Definition: DmbFactory.cs:176
+
DmbFactory(IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, ILogger< DmbFactory > logger, Api.Models.Instance instance)
Construct a DmbFactory
Definition: DmbFactory.cs:76
+
async Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)
Deletes all compile jobs that are inactive in the Game folder exceptThisOne
Definition: DmbFactory.cs:231
+
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:52
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:43
+ +
readonly Api.Models.Instance instance
The Api.Models.Instance for the DmbFactory
Definition: DmbFactory.cs:48
+
void CleanJob(CompileJob job)
Delete the Api.Models.Internal.CompileJob.DirectoryName of job
Definition: DmbFactory.cs:96
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
Definition: DmbFactory.cs:141
+
Guid DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+
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:61
+
async Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
Load a new job into the ICompileJobConsumer
Definition: DmbFactory.cs:123
+
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+ + + + +
+ + + + diff --git a/_dmb_provider_8cs.html b/_dmb_provider_8cs.html new file mode 100644 index 0000000000..09c73b5e73 --- /dev/null +++ b/_dmb_provider_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DmbProvider.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DmbProvider.cs File Reference
+
+ + + + + diff --git a/_dmb_provider_8cs_source.html b/_dmb_provider_8cs_source.html new file mode 100644 index 0000000000..a937a65a44 --- /dev/null +++ b/_dmb_provider_8cs_source.html @@ -0,0 +1,125 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Compiler
6 {
8  sealed class DmbProvider : IDmbProvider
9  {
11  public string DmbName => String.Concat(CompileJob.DmeName, DreamMaker.DmbExtension);
12 
14  public string PrimaryDirectory => ioManager.ResolvePath(ioManager.ConcatPath(CompileJob.DirectoryName.ToString(), DreamMaker.ADirectoryName));
15 
17  public string SecondaryDirectory => ioManager.ResolvePath(ioManager.ConcatPath(CompileJob.DirectoryName.ToString(), DreamMaker.BDirectoryName));
18 
21 
25  public CompileJob CompileJob { get; }
26 
34  Action onDispose;
35 
42  public DmbProvider(CompileJob compileJob, IIOManager ioManager, Action onDispose)
43  {
44  CompileJob = compileJob ?? throw new ArgumentNullException(nameof(compileJob));
45  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
46  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
47  }
48 
50  public void Dispose() => onDispose?.Invoke();
51 
53  public void KeepAlive() => onDispose = null;
54  }
55 }
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:30
+
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:42
+
Action onDispose
The Action to run when Dispose is called
Definition: DmbProvider.cs:34
+
const string DmbExtension
Extension for .dmbs
Definition: DreamMaker.cs:34
+
readonly IIOManager ioManager
The IIOManager for the DmbProvider
Definition: DmbProvider.cs:30
+
Guid DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+ +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
RevisionInformation RevisionInformation
See Api.Models.CompileJob.RevisionInformation
Definition: CompileJob.cs:24
+ + + + +
+ + + + diff --git a/_dream_daemon_8cs.html b/_dream_daemon_8cs.html new file mode 100644 index 0000000000..3bcda161b8 --- /dev/null +++ b/_dream_daemon_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Models
 
+
+ + + + diff --git a/_dream_daemon_8cs_source.html b/_dream_daemon_8cs_source.html new file mode 100644 index 0000000000..166eb7e593 --- /dev/null +++ b/_dream_daemon_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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
DreamDaemon&#39;s security level
+
Represents an instance of BYOND&#39;s DreamDaemon game server. Create action starts the server...
Definition: DreamDaemon.cs:8
+ +
+ + + + diff --git a/_dream_daemon_client_8cs.html b/_dream_daemon_client_8cs.html new file mode 100644 index 0000000000..68f18e6719 --- /dev/null +++ b/_dream_daemon_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/DreamDaemonClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonClient.cs File Reference
+
+ + + + + diff --git a/_dream_daemon_client_8cs_source.html b/_dream_daemon_client_8cs_source.html new file mode 100644 index 0000000000..186baeb483 --- /dev/null +++ b/_dream_daemon_client_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
7 namespace Tgstation.Server.Client.Components
8 {
11  {
19  readonly Instance instance;
20 
26  public DreamDaemonClient(IApiClient apiClient, Instance instance)
27  {
28  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
29  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
30  }
31 
33  public Task Shutdown(CancellationToken cancellationToken) => apiClient.Delete(Routes.DreamDaemon, instance.Id, cancellationToken);
34 
36  public Task<Job> Start(CancellationToken cancellationToken) => apiClient.Create<Job>(Routes.DreamDaemon, instance.Id, cancellationToken);
37 
39  public Task<Job> Restart(CancellationToken cancellationToken) => apiClient.Patch<Job>(Routes.DreamDaemon, instance.Id, cancellationToken);
40 
42  public Task<DreamDaemon> Read(CancellationToken cancellationToken) => apiClient.Read<DreamDaemon>(Routes.DreamDaemon, instance.Id, cancellationToken);
43 
45  public Task<DreamDaemon> Update(DreamDaemon dreamDaemon, CancellationToken cancellationToken) => apiClient.Update<DreamDaemon, DreamDaemon>(Routes.DreamDaemon, dreamDaemon ?? throw new ArgumentNullException(nameof(dreamDaemon)), instance.Id, cancellationToken);
46  }
47 }
DreamDaemonClient(IApiClient apiClient, Instance instance)
Construct a DreamDaemonClient
+ + + + +
Routes to a server actions
Definition: Routes.cs:9
+ +
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
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
Represents an instance of BYOND&#39;s DreamDaemon game server. Create action starts the server...
Definition: DreamDaemon.cs:8
+
readonly IApiClient apiClient
The IApiClient for the DreamDaemonClient
+ +
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..15ff7260fa --- /dev/null +++ b/_dream_daemon_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6a2c32195a --- /dev/null +++ b/_dream_daemon_controller_8cs_source.html @@ -0,0 +1,154 @@ + + + + + + +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 
20 namespace Tgstation.Server.Host.Controllers
21 {
25  [Route(Routes.DreamDaemon)]
26  public sealed class DreamDaemonController : ModelController<DreamDaemon>
27  {
36 
45  public DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamDaemonController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
46  {
47  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
48  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
49  }
50 
52  [TgsAuthorize(DreamDaemonRights.Start)]
53  public override async Task<IActionResult> Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)
54  {
55  //alias for launching DD
56  var instance = instanceManager.GetInstance(Instance);
57 
58  if (instance.Watchdog.Running)
59  return StatusCode((int)HttpStatusCode.Gone);
60 
61  var job = new Models.Job
62  {
63  Description = "Launch DreamDaemon",
64  CancelRight = (ulong)DreamDaemonRights.Shutdown,
65  CancelRightsType = RightsType.DreamDaemon,
67  StartedBy = AuthenticationContext.User
68  };
69  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, innerCt) => instance.Watchdog.Launch(innerCt), cancellationToken).ConfigureAwait(false);
70  return Accepted(job.ToApi());
71  }
72 
74  [TgsAuthorize(DreamDaemonRights.ReadMetadata | DreamDaemonRights.ReadRevision)]
75  public override Task<IActionResult> Read(CancellationToken cancellationToken) => ReadImpl(null, cancellationToken);
76 
83  async Task<IActionResult> ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
84  {
85  var instance = instanceManager.GetInstance(Instance);
86  var dd = instance.Watchdog;
87 
88  var metadata = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadMetadata) != 0;
89  var revision = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadRevision) != 0;
90 
91  if (settings == null)
92  {
93  settings = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
94  if (settings == default)
95  return StatusCode((int)HttpStatusCode.Gone);
96  }
97 
98  var result = new DreamDaemon();
99  if (metadata)
100  {
101  var alphaActive = dd.AlphaIsActive;
102  var llp = dd.LastLaunchParameters;
103  var rstate = dd.RebootState;
104  result.AutoStart = settings.AutoStart;
105  result.CurrentPort = alphaActive ? llp?.PrimaryPort : llp?.SecondaryPort;
106  result.CurrentSecurity = llp?.SecurityLevel;
107  result.CurrentAllowWebclient = llp?.AllowWebClient;
108  result.PrimaryPort = settings.PrimaryPort;
109  result.AllowWebClient = settings.AllowWebClient;
110  result.Running = dd.Running;
111  result.SecondaryPort = settings.SecondaryPort;
112  result.SecurityLevel = settings.SecurityLevel;
113  result.SoftRestart = rstate == RebootState.Restart;
114  result.SoftShutdown = rstate == RebootState.Shutdown;
115  result.StartupTimeout = settings.StartupTimeout;
116  };
117 
118  if (revision)
119  {
120  var latestCompileJob = instance.LatestCompileJob();
121  result.ActiveCompileJob = (dd.ActiveCompileJob ?? latestCompileJob)?.ToApi();
122  if (latestCompileJob?.Id != result.ActiveCompileJob?.Id)
123  result.StagedCompileJob = latestCompileJob?.ToApi();
124  }
125 
126  return Json(result);
127  }
128 
130  [HttpDelete]
131  [TgsAuthorize(DreamDaemonRights.Shutdown)]
132  public async Task<IActionResult> Delete(CancellationToken cancellationToken)
133  {
134  //alias for stopping DD
135  var instance = instanceManager.GetInstance(Instance);
136  await instance.Watchdog.Terminate(false, cancellationToken).ConfigureAwait(false);
137  return Ok();
138  }
139 
141  [TgsAuthorize(DreamDaemonRights.SetAutoStart | DreamDaemonRights.SetPorts | DreamDaemonRights.SetSecurity | DreamDaemonRights.SetWebClient | DreamDaemonRights.SoftRestart | DreamDaemonRights.SoftShutdown | DreamDaemonRights.Start | DreamDaemonRights.SetStartupTimeout)]
142  public override async Task<IActionResult> Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)
143  {
144  if (model == null)
145  throw new ArgumentNullException(nameof(model));
146 
147  if (model.PrimaryPort == 0)
148  return BadRequest(new ErrorMessage { Message = "Primary port cannot be 0!" });
149 
150  if (model.SecurityLevel == DreamDaemonSecurity.Ultrasafe)
151  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
152 
153  //alias for changing DD settings
154  var current = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
155 
156  if (current == default)
157  return StatusCode((int)HttpStatusCode.Gone);
158 
159  var userRights = (DreamDaemonRights)AuthenticationContext.GetRight(RightsType.DreamDaemon);
160 
161  bool CheckModified<T>(Expression<Func<Api.Models.Internal.DreamDaemonSettings, T>> expression, DreamDaemonRights requiredRight)
162  {
163  var memberSelectorExpression = (MemberExpression)expression.Body;
164  var property = (PropertyInfo)memberSelectorExpression.Member;
165 
166  var newVal = property.GetValue(model);
167  if (newVal == null)
168  return false;
169  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
170  return true;
171 
172  property.SetValue(current, newVal);
173  return false;
174  };
175 
176  var oldSoftRestart = current.SoftRestart;
177  var oldSoftShutdown = current.SoftShutdown;
178 
179  if (CheckModified(x => x.AllowWebClient, DreamDaemonRights.SetWebClient)
180  || CheckModified(x => x.AutoStart, DreamDaemonRights.SetAutoStart)
181  || CheckModified(x => x.PrimaryPort, DreamDaemonRights.SetPorts)
182  || CheckModified(x => x.SecondaryPort, DreamDaemonRights.SetPorts)
183  || CheckModified(x => x.SecurityLevel, DreamDaemonRights.SetSecurity)
184  || CheckModified(x => x.SoftRestart, DreamDaemonRights.SoftRestart)
185  || CheckModified(x => x.SoftShutdown, DreamDaemonRights.SoftShutdown)
186  || CheckModified(x => x.StartupTimeout, DreamDaemonRights.SetStartupTimeout))
187  return Forbid();
188 
189  if (current.PrimaryPort == current.SecondaryPort)
190  return BadRequest(new ErrorMessage { Message = "Primary port and secondary port cannot be the same!" });
191 
192  var wd = instanceManager.GetInstance(Instance).Watchdog;
193 
194  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
195  //run this second because current may be modified by it
196  await wd.ChangeSettings(current, cancellationToken).ConfigureAwait(false);
197 
198  if (!oldSoftRestart.Value && current.SoftRestart.Value)
199  await wd.Restart(true, cancellationToken).ConfigureAwait(false);
200  else if (!oldSoftShutdown.Value && current.SoftShutdown.Value)
201  await wd.Terminate(true, cancellationToken).ConfigureAwait(false);
202  else if ((oldSoftRestart.Value && !current.SoftRestart.Value) || (oldSoftShutdown.Value && !current.SoftShutdown.Value))
203  await wd.ResetRebootState(cancellationToken).ConfigureAwait(false);
204 
205  return await ReadImpl(current, cancellationToken).ConfigureAwait(false);
206  }
207 
213  [HttpPatch]
214  [TgsAuthorize(DreamDaemonRights.Restart)]
215  public async Task<IActionResult> Restart(CancellationToken cancellationToken)
216  {
217  var job = new Models.Job
218  {
219  Instance = Instance,
220  CancelRightsType = RightsType.DreamDaemon,
221  CancelRight = (ulong)DreamDaemonRights.Shutdown,
222  StartedBy = AuthenticationContext.User,
223  Description = "Restart Watchdog"
224  };
225 
226  var watchdog = instanceManager.GetInstance(Instance).Watchdog;
227 
228  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => watchdog.Restart(false, ct), cancellationToken).ConfigureAwait(false);
229  return Accepted(job.ToApi());
230  }
231  }
232 }
async Task< IActionResult > Delete(CancellationToken cancellationToken)
+ +
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ + + + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ + + + + +
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
bool AutoStart
If DreamDaemon starts when it&#39;s Instance starts
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ + +
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
+ +
Metadata about a server instance
Definition: Instance.cs:9
+
override async Task< IActionResult > Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)
+ + +
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
Represents an instance of BYOND&#39;s DreamDaemon game server. Create action starts the server...
Definition: DreamDaemon.cs:8
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + +
ushort PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+ + +
bool AllowWebClient
If the BYOND web client can be used to connect to the game server
+
+ + + + diff --git a/_dream_daemon_launch_parameters_8cs.html b/_dream_daemon_launch_parameters_8cs.html new file mode 100644 index 0000000000..651380350e --- /dev/null +++ b/_dream_daemon_launch_parameters_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/DreamDaemonLaunchParameters.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonLaunchParameters.cs File Reference
+
+ + + + + diff --git a/_dream_daemon_launch_parameters_8cs_source.html b/_dream_daemon_launch_parameters_8cs_source.html new file mode 100644 index 0000000000..9b3e641a6d --- /dev/null +++ b/_dream_daemon_launch_parameters_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
4 namespace Tgstation.Server.Api.Models.Internal
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
48  && SecurityLevel == otherParameters.SecurityLevel
49  && PrimaryPort == otherParameters.PrimaryPort
50  && SecondaryPort == otherParameters.SecondaryPort
51  && StartupTimeout == otherParameters.StartupTimeout;
52  }
53 }
+ + +
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+ +
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
ushort PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+ + +
bool AllowWebClient
If the BYOND web client can be used to connect to the game server
+
+ + + + diff --git a/_dream_daemon_rights_8cs.html b/_dream_daemon_rights_8cs.html new file mode 100644 index 0000000000..15f9c1c227 --- /dev/null +++ b/_dream_daemon_rights_8cs.html @@ -0,0 +1,138 @@ + + + + + + +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..e9c936794d --- /dev/null +++ b/_dream_daemon_rights_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum DreamDaemonRights : ulong
10  {
14  None = 0,
18  ReadRevision = 1,
22  SetPorts = 2,
26  SetAutoStart = 4,
30  SetSecurity = 8,
34  ReadMetadata = 16,
38  SetWebClient = 32,
42  SoftRestart = 64,
46  SoftShutdown = 128,
50  Restart = 256,
54  Shutdown = 512,
58  Start = 1024,
62  SetStartupTimeout = 2048
63  }
64 }
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.DreamDaemonSettings.SoftShutdown, Models.DreamDaemon.Running, Models.Internal.DreamDaemonLaunchParameters.AllowWebClient, and Models.Internal.DreamDaemonSettings.AutoStart
+
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.SoftRestart and Models.Internal.DreamDaemonSettings.SoftShutdown
+
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..f92e7da8af --- /dev/null +++ b/_dream_daemon_security_8cs.html @@ -0,0 +1,123 @@ + + + + + + +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..88aed34370 --- /dev/null +++ b/_dream_daemon_security_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
2 {
6  public enum DreamDaemonSecurity
7  {
11  Trusted,
15  Safe,
19  Ultrasafe
20  }
21 }
+
Server will not be able to run shell commands or access files outside it&#39;s working directory ...
+
Server will not be able to run shell commands or access anything but temporary files. Currently unsupported!
+
Server is unrestricted in terms of file access and shell commands
+
DreamDaemonSecurity
DreamDaemon&#39;s security level
+ +
+ + + + diff --git a/_dream_daemon_status_8cs.html b/_dream_daemon_status_8cs.html new file mode 100644 index 0000000000..05b7c6831a --- /dev/null +++ b/_dream_daemon_status_8cs.html @@ -0,0 +1,123 @@ + + + + + + +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..f5d7b8f733 --- /dev/null +++ b/_dream_daemon_status_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
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,
21  Online,
22  }
23 }
+
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..fc10a61a6e --- /dev/null +++ b/_dream_maker_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/DreamMakerClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMakerClient.cs File Reference
+
+ + + + + diff --git a/_dream_maker_client_8cs_source.html b/_dream_maker_client_8cs_source.html new file mode 100644 index 0000000000..02db12676e --- /dev/null +++ b/_dream_maker_client_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client.Components
9 {
12  {
17 
21  readonly Instance instance;
22 
28  public DreamMakerClient(IApiClient apiClient, Instance instance)
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. Delete action cancels the current compile
Definition: DreamMaker.cs:8
+ + + + + + +
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
+
readonly Instance instance
The Instance for the DreamMakerClient
+
const string DreamMaker
The Models.DreamMaker controller
Definition: Routes.cs:74
+
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
+ + +
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..3a500e3fbc --- /dev/null +++ b/_dream_maker_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5390f6ad58 --- /dev/null +++ b/_dream_maker_controller_8cs_source.html @@ -0,0 +1,148 @@ + + + + + + +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 
17 namespace Tgstation.Server.Host.Controllers
18 {
22  [Route(Routes.DreamMaker)]
23  public sealed class DreamMakerController : ModelController<Api.Models.DreamMaker>
24  {
33 
42  public DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamMakerController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
43  {
44  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
45  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
46  }
47 
49  [TgsAuthorize(DreamMakerRights.Read)]
50  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
51  {
52  var instance = instanceManager.GetInstance(Instance);
53  var dreamMakerSettings = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
54  return Json(dreamMakerSettings.ToApi());
55  }
56 
58  [TgsAuthorize(DreamMakerRights.CompileJobs)]
59  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
60  {
61  var compileJob = await DatabaseContext.CompileJobs
62  .Where(x => x.Id == id && x.Job.Instance.Id == Instance.Id)
63  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
64  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
65  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
66  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
67  if (compileJob == default)
68  return NotFound();
69  return Json(compileJob.ToApi());
70  }
71 
73  [TgsAuthorize(DreamMakerRights.CompileJobs)]
74  public override async Task<IActionResult> List(CancellationToken cancellationToken)
75  {
76  var compileJobs = await DatabaseContext.CompileJobs.Where(x => x.Job.Instance.Id == Instance.Id).OrderByDescending(x => x.Job.StoppedAt).Select(x => new Api.Models.CompileJob
77  {
78  Id = x.Id
79  }).ToListAsync(cancellationToken).ConfigureAwait(false);
80  return Json(compileJobs);
81  }
82 
84  [TgsAuthorize(DreamMakerRights.Compile)]
85  public override async Task<IActionResult> Create([FromBody] DreamMaker model, CancellationToken cancellationToken)
86  {
87  var job = new Models.Job
88  {
89  Description = "Compile active repository code",
90  StartedBy = AuthenticationContext.User,
91  CancelRightsType = RightsType.DreamMaker,
92  CancelRight = (ulong)DreamMakerRights.CancelCompile,
94  };
95  await jobManager.RegisterOperation(job, instanceManager.GetInstance(Instance).CompileProcess, cancellationToken).ConfigureAwait(false);
96  return Accepted(job.ToApi());
97  }
98 
100  [TgsAuthorize(DreamMakerRights.SetDme | DreamMakerRights.SetApiValidationPort | DreamMakerRights.SetApiValidationPort)]
101  public override async Task<IActionResult> Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
102  {
103  if (model.ApiValidationPort == 0)
104  return BadRequest(new ErrorMessage { Message = "API Validation port cannot be 0!" });
105 
106  if (model.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
107  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
108 
109  var hostModel = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
110  if (hostModel == null)
111  return StatusCode((int)HttpStatusCode.Gone);
112 
113  if (model.ProjectName != null)
114  {
116  return Forbid();
117  if (model.ProjectName.Length == 0)
118  hostModel.ProjectName = null;
119  else
120  hostModel.ProjectName = model.ProjectName;
121  }
122 
123  if (model.ApiValidationPort.HasValue)
124  {
125  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetApiValidationPort))
126  return Forbid();
127  hostModel.ApiValidationPort = model.ApiValidationPort;
128  }
129 
130  if (model.ApiValidationSecurityLevel.HasValue)
131  {
132  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetSecurityLevel))
133  return Forbid();
134  hostModel.ApiValidationSecurityLevel = model.ApiValidationSecurityLevel;
135  }
136 
137  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
138 
139  if ((AuthenticationContext.GetRight(RightsType.DreamMaker) & (ulong)DreamMakerRights.Read) == 0)
140  return Ok();
141 
142  return await Read(cancellationToken).ConfigureAwait(false);
143  }
144  }
145 }
+
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. Delete action cancels the current 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
+ + +
override async Task< IActionResult > Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
+
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
+
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
+ + +
DreamMakerRights DreamMakerRights
The Rights.DreamMakerRights of the InstanceUser
Definition: InstanceUser.cs:39
+ +
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&#39;s security level
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
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..48fcce24e0 --- /dev/null +++ b/_dream_maker_rights_8cs.html @@ -0,0 +1,131 @@ + + + + + + +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..35dc8767a9 --- /dev/null +++ b/_dream_maker_rights_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum DreamMakerRights : ulong
10  {
14  None = 0,
18  Read = 1,
22  Compile = 2,
26  CancelCompile = 4,
30  SetDme = 8,
38  CompileJobs = 32,
42  SetSecurityLevel = 64
43  }
44 }
+ +
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..2a5899ef63 --- /dev/null +++ b/_dream_maker_settings_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DreamMakerSettings.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMakerSettings.cs File Reference
+
+ + + + + diff --git a/_dream_maker_settings_8cs_source.html b/_dream_maker_settings_8cs_source.html new file mode 100644 index 0000000000..16adae2631 --- /dev/null +++ b/_dream_maker_settings_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
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  {
30  ProjectName = ProjectName,
31  ApiValidationPort = ApiValidationPort,
32  ApiValidationSecurityLevel = ApiValidationSecurityLevel
33  };
34  }
35 }
+ + +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
+ + + + diff --git a/_error_message_8cs.html b/_error_message_8cs.html new file mode 100644 index 0000000000..31d51cf256 --- /dev/null +++ b/_error_message_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Models
 
+
+ + + + diff --git a/_error_message_8cs_source.html b/_error_message_8cs_source.html new file mode 100644 index 0000000000..a38cc590bd --- /dev/null +++ b/_error_message_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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
+
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..b4cc075aaa --- /dev/null +++ b/_event_consumer_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/EventConsumer.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EventConsumer.cs File Reference
+
+ + + + + diff --git a/_event_consumer_8cs_source.html b/_event_consumer_8cs_source.html new file mode 100644 index 0000000000..2981f03b9a --- /dev/null +++ b/_event_consumer_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Components
9 {
12  {
17 
22 
27  public EventConsumer(IConfiguration configuration)
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 
47  public void SetWatchdog(IWatchdog watchdog)
48  {
49  if (watchdog == null)
50  throw new ArgumentNullException(nameof(watchdog));
51  if (this.watchdog != null)
52  throw new InvalidOperationException("watchdog already set!");
53  this.watchdog = watchdog;
54  }
55  }
56 }
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
+
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
+
For managing the Configuration directory
+ + + +
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..95bcb5825a --- /dev/null +++ b/_event_notification_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/EventNotification.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EventNotification.cs File Reference
+
+ + + + + diff --git a/_event_notification_8cs_source.html b/_event_notification_8cs_source.html new file mode 100644 index 0000000000..d41c0f91d2 --- /dev/null +++ b/_event_notification_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Interop
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
+ + +
+ + + + diff --git a/_event_type_8cs.html b/_event_type_8cs.html new file mode 100644 index 0000000000..c5e0175e54 --- /dev/null +++ b/_event_type_8cs.html @@ -0,0 +1,139 @@ + + + + + + +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..cf39154ba2 --- /dev/null +++ b/_event_type_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components
2 {
6  public enum EventType
7  {
11  RepoResetOrigin = 0,
15  RepoCheckout = 1,
19  RepoFetch = 2,
28 
36  ByondInstallFail = 6,
44  CompileStart = 8,
48  CompileCancelled = 9,
52  CompileFailure = 10,
56  CompileComplete = 11,
57 
62 
66  RepoMergeConflict = 13,
67  }
68 }
+ + +
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: Reference name, commit sha
+
Parameters: Game directory path, origin commit sha
+
Parameters: Game directory path, "1" if compile succeeded and api validation failed, "0" otherwise
+
Parameters: Old active version, new active version
+ + + + +
+ + + + diff --git a/_file_logging_configuration_8cs.html b/_file_logging_configuration_8cs.html new file mode 100644 index 0000000000..4492e9def8 --- /dev/null +++ b/_file_logging_configuration_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..dbd1937047 --- /dev/null +++ b/_file_logging_configuration_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Configuration
6 {
11  {
15  public const string Section = "FileLogging";
16 
20  const LogLevel DefaultLogLevel = LogLevel.Debug;
21 
25  const LogLevel DefaultMicrosoftLogLevel = LogLevel.Warning;
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 
43 
47  [JsonConverter(typeof(StringEnumConverter))]
48  public LogLevel MicrosoftLogLevel { get; set; } = DefaultMicrosoftLogLevel;
49  }
50 }
+ + + + +
+ + + + diff --git a/_general_configuration_8cs.html b/_general_configuration_8cs.html new file mode 100644 index 0000000000..043a9b49fd --- /dev/null +++ b/_general_configuration_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Configuration
 
+
+ + + + diff --git a/_general_configuration_8cs_source.html b/_general_configuration_8cs_source.html new file mode 100644 index 0000000000..f4407db869 --- /dev/null +++ b/_general_configuration_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Configuration
5 {
9  public sealed class GeneralConfiguration
10  {
14  public const string Section = "General";
15 
19  const uint DefaultMinimumPasswordLength = 15;
20 
24  const int DefaultByondTopicTimeout = 5000;
25 
29  public uint MinimumPasswordLength { get; set; } = DefaultMinimumPasswordLength;
30 
34  public string GitHubAccessToken { get; set; }
35 
39  [JsonConverter(typeof(StringEnumConverter))]
40  public SetupWizardMode SetupWizardMode { get; set; }
41 
45  public int ByondTopicTimeout { get; set; } = DefaultByondTopicTimeout;
46  }
47 }
+
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + + + +
+ + + + diff --git a/_git_hub_client_factory_8cs.html b/_git_hub_client_factory_8cs.html new file mode 100644 index 0000000000..a03ab24765 --- /dev/null +++ b/_git_hub_client_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/GitHubClientFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
GitHubClientFactory.cs File Reference
+
+ + + + + diff --git a/_git_hub_client_factory_8cs_source.html b/_git_hub_client_factory_8cs_source.html new file mode 100644 index 0000000000..e83a76be4b --- /dev/null +++ b/_git_hub_client_factory_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Core
5 {
8  {
13 
18  public GitHubClientFactory(IApplication application)
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
+ + +
GitHubClientFactory(IApplication application)
Construct a GitHubClientFactory
+ +
readonly IApplication application
The IApplication for the GitHubClientFactory
+ + +
+ + + + diff --git a/_global_suppressions_8cs.html b/_global_suppressions_8cs.html new file mode 100644 index 0000000000..7889e1a0eb --- /dev/null +++ b/_global_suppressions_8cs.html @@ -0,0 +1,105 @@ + + + + + + +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..6e01bf0a86 --- /dev/null +++ b/_global_suppressions_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +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.Design", "CA2210:AssembliesShouldHaveValidStrongNames")]
2 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons)", Scope = "member", Target = "Tgstation.Server.Host.Service.Program.#OnExecute()")]
3 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions", Scope = "member", Target = "Tgstation.Server.Host.Service.Program.#OnExecute()")]
4 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2232:MarkWindowsFormsEntryPointsWithStaThread")]
5 // This file is used by Code Analysis to maintain SuppressMessage
6 // attributes that are applied to this project.
7 // Project-level suppressions either have no target or are given
8 // a specific target and scoped to a namespace, type, member, etc.
9 //
10 // To add a suppression to this file, right-click the message in the
11 // Code Analysis results, point to "Suppress Message", and click
12 // "In Suppression File".
13 // You do not need to add suppressions to this file manually.
14 
+
+ + + + diff --git a/_home_controller_8cs.html b/_home_controller_8cs.html new file mode 100644 index 0000000000..ba5cc3a01c --- /dev/null +++ b/_home_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Controllers
 
+
+ + + + diff --git a/_home_controller_8cs_source.html b/_home_controller_8cs_source.html new file mode 100644 index 0000000000..0010048c05 --- /dev/null +++ b/_home_controller_8cs_source.html @@ -0,0 +1,142 @@ + + + + + + +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.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Linq;
6 using System.Net.Http.Headers;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using Tgstation.Server.Api;
13 
14 namespace Tgstation.Server.Host.Controllers
15 {
19  [Route(Routes.Root)]
20  public sealed class HomeController : ApiController
21  {
42 
54  public HomeController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ITokenFactory tokenFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, IApplication application, IIdentityCache identityCache, ILogger<HomeController> logger) : base(databaseContext, authenticationContextFactory, logger, false)
55  {
56  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
57  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
58  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
59  this.application = application ?? throw new ArgumentNullException(nameof(application));
60  this.identityCache = identityCache ?? throw new ArgumentNullException(nameof(identityCache));
61  }
62 
67  [TgsAuthorize]
68  [HttpGet]
69  public JsonResult Home() => Json(new Api.Models.ServerInformation
70  {
71  Version = application.Version,
72  ApiVersion = ApiHeaders.Version
73  });
74 
80  [HttpPost]
81  public async Task<IActionResult> CreateToken(CancellationToken cancellationToken)
82  {
84  return BadRequest(new Api.Models.ErrorMessage { Message = "Cannot create a token using another token!" });
85 
86  ISystemIdentity identity;
87  try
88  {
89  //trust the system over the database because a user's name can change while still having the same SID
90  identity = await systemIdentityFactory.CreateSystemIdentity(ApiHeaders.Username, ApiHeaders.Password, cancellationToken).ConfigureAwait(false);
91  }
92  catch (NotImplementedException)
93  {
94  identity = null;
95  }
96  using (identity)
97  {
98  IQueryable<User> query;
99  if (identity == null)
100  query = DatabaseContext.Users.Where(x => x.CanonicalName == ApiHeaders.Username.ToUpperInvariant());
101  else
102  query = DatabaseContext.Users.Where(x => x.SystemIdentifier == identity.Uid);
103  var user = await query.Select(x => new User
104  {
105  Id = x.Id,
106  PasswordHash = x.PasswordHash,
107  Enabled = x.Enabled,
108  Name = x.Name
109  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
110 
111  if (user == null)
112  return Unauthorized();
113 
114  if (identity == null)
115  {
116  var originalHash = user.PasswordHash;
117  if (!cryptographySuite.CheckUserPassword(user, ApiHeaders.Password))
118  return Unauthorized();
119  if (user.PasswordHash != originalHash)
120  {
121  var updatedUser = new User
122  {
123  Id = user.Id
124  };
125  DatabaseContext.Users.Attach(updatedUser);
126  updatedUser.PasswordHash = user.PasswordHash;
127  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
128  }
129  }
130  //check if the name changed and updoot accordingly
131  else if (identity.Username != user.Name)
132  {
133  DatabaseContext.Users.Attach(user);
134  user.Name = identity.Username;
135  user.CanonicalName = user.Name.ToUpperInvariant();
136  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
137  }
138 
139  if (!user.Enabled.Value)
140  return Forbid();
141 
142  var token = await tokenFactory.CreateToken(user, cancellationToken).ConfigureAwait(false);
143  if (identity != null)
144  {
145  //expire the identity slightly after the auth token in case of lag
146  var identExpiry = token.ExpiresAt.Value;
147  identExpiry += tokenFactory.ValidationParameters.ClockSkew;
148  identExpiry += TimeSpan.FromSeconds(15);
149  identityCache.CacheSystemIdentity(user, identity, identExpiry);
150  }
151 
152  Logger.LogDebug("Successfully logged in user {0}!", user.Id);
153 
154  return Json(token);
155  }
156  }
157  }
158 }
+ +
async Task< IActionResult > CreateToken(CancellationToken cancellationToken)
Attempt to authenticate a User using ApiController.ApiHeaders
+ +
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ + +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + +
string Username
The client&#39;s username
Definition: ApiHeaders.cs:81
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
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
+ +
string Password
The client&#39;s password
Definition: ApiHeaders.cs:86
+
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:91
+ +
const string Root
The root controller
Definition: Routes.cs:14
+ + +
long Id
The ID of the User
Definition: User.cs:15
+
HomeController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ITokenFactory tokenFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, IApplication application, IIdentityCache identityCache, ILogger< HomeController > logger)
Construct a HomeController
+ + +
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..1c273151ad --- /dev/null +++ b/_http_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_http_client_8cs_source.html b/_http_client_8cs_source.html new file mode 100644 index 0000000000..11a6b85194 --- /dev/null +++ b/_http_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
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 }
TimeSpan Timeout
The request timeout
Definition: IHttpClient.cs:16
+ + +
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
+ + +
+ + + + diff --git a/_i_administration_client_8cs.html b/_i_administration_client_8cs.html new file mode 100644 index 0000000000..61999414a7 --- /dev/null +++ b/_i_administration_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_i_administration_client_8cs_source.html b/_i_administration_client_8cs_source.html new file mode 100644 index 0000000000..11371786a6 --- /dev/null +++ b/_i_administration_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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 }
+ + + + + + + +
+ + + + diff --git a/_i_api_client_8cs.html b/_i_api_client_8cs.html new file mode 100644 index 0000000000..1c947358a9 --- /dev/null +++ b/_i_api_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_i_api_client_8cs_source.html b/_i_api_client_8cs_source.html new file mode 100644 index 0000000000..68b2818eea --- /dev/null +++ b/_i_api_client_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
7 {
11  interface IApiClient : IDisposable
12  {
13  ApiHeaders Headers { get; set; }
14 
15  Uri Url { get; }
16 
17  TimeSpan Timeout { get; set; }
18 
23  void AddRequestLogger(IRequestLogger requestLogger);
24 
25  Task<TResult> Create<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken);
26  Task<TResult> Create<TResult>(string route, CancellationToken cancellationToken);
27  Task<TResult> Read<TResult>(string route, CancellationToken cancellationToken);
28  Task<TResult> Update<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken);
29  Task<TResult> Update<TResult>(string route, CancellationToken cancellationToken);
30  Task Update<TBody>(string route, TBody body, CancellationToken cancellationToken);
31  Task Delete(string route, CancellationToken cancellationToken);
32 
33  Task<TResult> Create<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken);
34  Task<TResult> Create<TResult>(string route, long instanceId, CancellationToken cancellationToken);
35  Task<TResult> Patch<TResult>(string route, long instanceId, CancellationToken cancellationToken);
36  Task<TResult> Read<TResult>(string route, long instanceId, CancellationToken cancellationToken);
37  Task<TResult> Update<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken);
38  Task Delete(string route, long instanceId, CancellationToken cancellationToken);
39  Task Delete<TBody>(string route, TBody body, long instanceId, CancellationToken cancellationToken);
40  Task<TResult> Delete<TResult>(string route, long instanceId, CancellationToken cancellationToken);
41  }
42 }
+ + +
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
For logging HTTP requests and responses
+ + +
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..88084f7735 --- /dev/null +++ b/_i_api_client_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6316ae978e --- /dev/null +++ b/_i_api_client_factory_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
4 namespace Tgstation.Server.Client
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
+ +
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..2ec0bfafc3 --- /dev/null +++ b/_i_application_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_i_application_8cs_source.html b/_i_application_8cs_source.html new file mode 100644 index 0000000000..d37ba421e2 --- /dev/null +++ b/_i_application_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Core
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
+ + + +
+ + + + diff --git a/_i_async_delayer_8cs.html b/_i_async_delayer_8cs.html new file mode 100644 index 0000000000..40b2959ed9 --- /dev/null +++ b/_i_async_delayer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6eb3e71cd5 --- /dev/null +++ b/_i_async_delayer_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Core
6 {
10  interface IAsyncDelayer
11  {
18  Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken);
19  }
20 }
+ + + +
+ + + + diff --git a/_i_authentication_context_8cs.html b/_i_authentication_context_8cs.html new file mode 100644 index 0000000000..f3c9ec68c4 --- /dev/null +++ b/_i_authentication_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..9edfa9a5c5 --- /dev/null +++ b/_i_authentication_context_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Security
6 {
11  {
15  User User { get; }
16 
21 
27  ulong GetRight(RightsType rightsType);
28 
32  ISystemIdentity SystemIdentity { get; }
33  }
34 }
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
+ + + + + + + +
+ + + + diff --git a/_i_authentication_context_factory_8cs.html b/_i_authentication_context_factory_8cs.html new file mode 100644 index 0000000000..f15a13a7fb --- /dev/null +++ b/_i_authentication_context_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..61e8c686e9 --- /dev/null +++ b/_i_authentication_context_factory_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Security
6 {
11  {
15  IAuthenticationContext CurrentAuthenticationContext { get; }
16 
25  Task CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken);
26  }
27 }
+ + +
Represents the currently authenticated Api.Models.User
+ +
+ + + + diff --git a/_i_byond_client_8cs.html b/_i_byond_client_8cs.html new file mode 100644 index 0000000000..d538fe8166 --- /dev/null +++ b/_i_byond_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..60b69d9fe3 --- /dev/null +++ b/_i_byond_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client.Components
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
+ + +
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..58f05936e3 --- /dev/null +++ b/_i_byond_executable_lock_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..1fdb8f08f5 --- /dev/null +++ b/_i_byond_executable_lock_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Byond
4 {
8  public interface IByondExecutableLock : IDisposable
9  {
13  Version Version { get; }
14 
18  string DreamDaemonPath { get; }
19 
23  string DreamMakerPath { get; }
24 
28  void DoNotDeleteThisSession();
29  }
30 }
+ + +
Represents usage of the two primary BYOND server executables
+ + +
+ + + + diff --git a/_i_byond_installer_8cs.html b/_i_byond_installer_8cs.html new file mode 100644 index 0000000000..4836432c02 --- /dev/null +++ b/_i_byond_installer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..a3be4730c0 --- /dev/null +++ b/_i_byond_installer_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Byond
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 }
+ + +
For downloading and installing BYOND extractions for a given system
+ +
+ + + + diff --git a/_i_byond_manager_8cs.html b/_i_byond_manager_8cs.html new file mode 100644 index 0000000000..ee36a1257c --- /dev/null +++ b/_i_byond_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e800377ebb --- /dev/null +++ b/_i_byond_manager_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Components.Byond
8 {
13  {
17  Version ActiveVersion { get; }
18 
22  IReadOnlyList<Version> InstalledVersions { get; }
23 
29  Task ChangeVersion(Version version, CancellationToken cancellationToken);
30 
37  Task<IByondExecutableLock> UseExecutables(Version requiredVersion, CancellationToken cancellationToken);
38  }
39 }
+ + +
For managing the BYOND installation
+ + + +
+ + + + diff --git a/_i_chat_8cs.html b/_i_chat_8cs.html new file mode 100644 index 0000000000..2d1e9f1180 --- /dev/null +++ b/_i_chat_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_i_chat_8cs_source.html b/_i_chat_8cs_source.html new file mode 100644 index 0000000000..fdc5419025 --- /dev/null +++ b/_i_chat_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Components.Chat
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 }
+ + +
Manage the server chat bots
Definition: ChatBot.cs:10
+
For managing connected chat services
Definition: IChat.cs:13
+ + +
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..c8b51ca6a4 --- /dev/null +++ b/_i_chat_bots_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..8e25f71807 --- /dev/null +++ b/_i_chat_bots_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client.Components
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 }
+ + + + + + + +
+ + + + diff --git a/_i_chat_factory_8cs.html b/_i_chat_factory_8cs.html new file mode 100644 index 0000000000..c184a25ef8 --- /dev/null +++ b/_i_chat_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..1ff7743f84 --- /dev/null +++ b/_i_chat_factory_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Chat
6 {
10  interface IChatFactory
11  {
19  IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable<Models.ChatBot> initialChatBots);
20  }
21 }
+ + + +
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..134a1f49c7 --- /dev/null +++ b/_i_claims_injector_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..141dacf5c3 --- /dev/null +++ b/_i_claims_injector_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Security
6 {
10  interface IClaimsInjector
11  {
18  Task InjectClaimsIntoContext(TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken);
19  }
20 }
+ +
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..fbb14ffd30 --- /dev/null +++ b/_i_comm_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..c0d0e2fb82 --- /dev/null +++ b/_i_comm_context_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Interop
4 {
9  {
14  void RegisterHandler(ICommHandler handler);
15  }
16 }
+ +
Represents a registration of an interop session
Definition: ICommContext.cs:8
+ + + +
+ + + + diff --git a/_i_comm_handler_8cs.html b/_i_comm_handler_8cs.html new file mode 100644 index 0000000000..74c8592ac8 --- /dev/null +++ b/_i_comm_handler_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ICommHandler.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICommHandler.cs File Reference
+
+ + + + + diff --git a/_i_comm_handler_8cs_source.html b/_i_comm_handler_8cs_source.html new file mode 100644 index 0000000000..179d2f9998 --- /dev/null +++ b/_i_comm_handler_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Interop
5 {
9  interface ICommHandler
10  {
17  Task HandleInterop(CommCommand command, CancellationToken cancellationToken);
18  }
19 }
+ + + + +
+ + + + diff --git a/_i_command_8cs.html b/_i_command_8cs.html new file mode 100644 index 0000000000..24f447ae76 --- /dev/null +++ b/_i_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..63701aef1b --- /dev/null +++ b/_i_command_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Chat.Commands
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 }
+ +
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/_i_command_factory_8cs.html b/_i_command_factory_8cs.html new file mode 100644 index 0000000000..55d2b1bcc8 --- /dev/null +++ b/_i_command_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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
+
+ + + + + diff --git a/_i_command_factory_8cs_source.html b/_i_command_factory_8cs_source.html new file mode 100644 index 0000000000..fe7d4fd8a0 --- /dev/null +++ b/_i_command_factory_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Chat.Commands
4 {
8  interface ICommandFactory
9  {
14  IReadOnlyList<ICommand> GenerateCommands();
15  }
16 }
+ + + +
+ + + + diff --git a/_i_compile_job_consumer_8cs.html b/_i_compile_job_consumer_8cs.html new file mode 100644 index 0000000000..99c59ac8c7 --- /dev/null +++ b/_i_compile_job_consumer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..231008f8ed --- /dev/null +++ b/_i_compile_job_consumer_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Components.Compiler
8 {
13  {
20  Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken);
21  }
22 }
+ + + + + + + + + +
+ + + + diff --git a/_i_configuration_8cs.html b/_i_configuration_8cs.html new file mode 100644 index 0000000000..209c3146b6 --- /dev/null +++ b/_i_configuration_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles/IConfiguration.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IConfiguration.cs File Reference
+
+ + + + + diff --git a/_i_configuration_8cs_source.html b/_i_configuration_8cs_source.html new file mode 100644 index 0000000000..7d478de963 --- /dev/null +++ b/_i_configuration_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Components.StaticFiles
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
+ + +
For managing the Configuration directory
+ + + + + + +
+ + + + diff --git a/_i_configuration_client_8cs.html b/_i_configuration_client_8cs.html new file mode 100644 index 0000000000..fa7cfbe181 --- /dev/null +++ b/_i_configuration_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..7a04e53d4f --- /dev/null +++ b/_i_configuration_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client.Components
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 }
+ + + +
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+ + + +
+ + + + diff --git a/_i_console_8cs.html b/_i_console_8cs.html new file mode 100644 index 0000000000..3abb3e0778 --- /dev/null +++ b/_i_console_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.IO
 
+
+ + + + diff --git a/_i_console_8cs_source.html b/_i_console_8cs_source.html new file mode 100644 index 0000000000..15e1707b6c --- /dev/null +++ b/_i_console_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.IO
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
+ + +
+ + + + diff --git a/_i_credentials_provider_8cs.html b/_i_credentials_provider_8cs.html new file mode 100644 index 0000000000..7da6219fb8 --- /dev/null +++ b/_i_credentials_provider_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..03737fd776 --- /dev/null +++ b/_i_credentials_provider_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Repository
4 {
9  {
16  CredentialsHandler GenerateHandler(string username, string password);
17  }
18 }
+ + + + +
+ + + + diff --git a/_i_cryptography_suite_8cs.html b/_i_cryptography_suite_8cs.html new file mode 100644 index 0000000000..75b9bb63a6 --- /dev/null +++ b/_i_cryptography_suite_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..b7986d9db2 --- /dev/null +++ b/_i_cryptography_suite_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Security
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 }
+ +
Contains various cryptographic functions
+ + + + +
+ + + + diff --git a/_i_custom_command_handler_8cs.html b/_i_custom_command_handler_8cs.html new file mode 100644 index 0000000000..d67046ec99 --- /dev/null +++ b/_i_custom_command_handler_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d6575bf2c6 --- /dev/null +++ b/_i_custom_command_handler_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Chat
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
+ +
+ + + + diff --git a/_i_d_b_connection_factory_8cs.html b/_i_d_b_connection_factory_8cs.html new file mode 100644 index 0000000000..70589a5570 --- /dev/null +++ b/_i_d_b_connection_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..2544fbc2f9 --- /dev/null +++ b/_i_d_b_connection_factory_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Core
5 {
10  {
17  DbConnection CreateConnection(string connectionString, DatabaseType databaseType);
18  }
19 }
+ + + +
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..068b97ccfe --- /dev/null +++ b/_i_database_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..4a5326b336 --- /dev/null +++ b/_i_database_context_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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.Threading;
3 using System.Threading.Tasks;
4 
5 namespace Tgstation.Server.Host.Models
6 {
10  public interface IDatabaseContext
11  {
15  DbSet<User> Users { get; }
16 
20  DbSet<Instance> Instances { get; }
21 
25  DbSet<InstanceUser> InstanceUsers { get; }
26 
30  DbSet<Job> Jobs { get; }
31 
35  DbSet<CompileJob> CompileJobs { get; }
36 
40  DbSet<RevisionInformation> RevisionInformations { get; }
41 
45  DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
46 
50  DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
51 
55  DbSet<ChatBot> ChatBots { get; set; }
56 
60  DbSet<ChatChannel> ChatChannels { get; set; }
61 
65  DbSet<RepositorySettings> RepositorySettings { get; set; }
66 
70  DbSet<ReattachInformation> ReattachInformations { get; set; }
71 
75  DbSet<WatchdogReattachInformation> WatchdogReattachInformations { get; set; }
76 
82  Task Save(CancellationToken cancellationToken);
83 
89  Task Initialize(CancellationToken cancellationToken);
90  }
91 }
+ + + + + + +
+ + + + diff --git a/_i_database_context_factory_8cs.html b/_i_database_context_factory_8cs.html new file mode 100644 index 0000000000..4ca7937d55 --- /dev/null +++ b/_i_database_context_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..b8cb1c51dc --- /dev/null +++ b/_i_database_context_factory_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Core
6 {
11  {
17  Task UseContext(Func<IDatabaseContext, Task> operation);
18  }
19 }
+ + +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ + + +
+ + + + diff --git a/_i_database_seeder_8cs.html b/_i_database_seeder_8cs.html new file mode 100644 index 0000000000..6d1b145cb8 --- /dev/null +++ b/_i_database_seeder_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..47dc63553b --- /dev/null +++ b/_i_database_seeder_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Models
5 {
9  interface IDatabaseSeeder
10  {
17  Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken);
18 
25  Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken);
26  }
27 }
+ + +
For initially seeding a database
+ +
+ + + + diff --git a/_i_dmb_factory_8cs.html b/_i_dmb_factory_8cs.html new file mode 100644 index 0000000000..144d4da88c --- /dev/null +++ b/_i_dmb_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/IDmbFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDmbFactory.cs File Reference
+
+ + + + + diff --git a/_i_dmb_factory_8cs_source.html b/_i_dmb_factory_8cs_source.html new file mode 100644 index 0000000000..3d2062aca2 --- /dev/null +++ b/_i_dmb_factory_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Compiler
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  }
48 }
+ + + + +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ + + +
+ + + + diff --git a/_i_dmb_provider_8cs.html b/_i_dmb_provider_8cs.html new file mode 100644 index 0000000000..fa3d05543b --- /dev/null +++ b/_i_dmb_provider_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..78d35e4389 --- /dev/null +++ b/_i_dmb_provider_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components
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 }
+ + + +
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..c78382f3b9 --- /dev/null +++ b/_i_dream_daemon_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..08d10f3007 --- /dev/null +++ b/_i_dream_daemon_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client.Components
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 }
+ + + + + +
Represents an instance of BYOND&#39;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..b83c5c4929 --- /dev/null +++ b/_i_dream_maker_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..3c570d78f9 --- /dev/null +++ b/_i_dream_maker_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Compiler
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
+ + + + + +
+ + + + diff --git a/_i_dream_maker_client_8cs.html b/_i_dream_maker_client_8cs.html new file mode 100644 index 0000000000..d877cb9f35 --- /dev/null +++ b/_i_dream_maker_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e8ef97ea53 --- /dev/null +++ b/_i_dream_maker_client_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client.Components
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. Delete action cancels the current compile
Definition: DreamMaker.cs:8
+ + + + + + + + +
+ + + + diff --git a/_i_event_consumer_8cs.html b/_i_event_consumer_8cs.html new file mode 100644 index 0000000000..68d6c2d46f --- /dev/null +++ b/_i_event_consumer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..f1e4844b6f --- /dev/null +++ b/_i_event_consumer_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components
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
+ +
+ + + + diff --git a/_i_git_hub_client_factory_8cs.html b/_i_git_hub_client_factory_8cs.html new file mode 100644 index 0000000000..938dc4cfef --- /dev/null +++ b/_i_git_hub_client_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..24feb5b019 --- /dev/null +++ b/_i_git_hub_client_factory_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Core
4 {
8  public interface IGitHubClientFactory
9  {
14  IGitHubClient CreateClient();
15 
21  IGitHubClient CreateClient(string accessToken);
22  }
23 }
+ + + +
+ + + + diff --git a/_i_http_client_8cs.html b/_i_http_client_8cs.html new file mode 100644 index 0000000000..bae70aa3a7 --- /dev/null +++ b/_i_http_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_i_http_client_8cs_source.html b/_i_http_client_8cs_source.html new file mode 100644 index 0000000000..136e0e8760 --- /dev/null +++ b/_i_http_client_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
7 {
12  {
16  TimeSpan Timeout { get; set; }
17 
24  Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);
25  }
26 }
+ +
For sending HTTP requests
Definition: IHttpClient.cs:11
+ + +
+ + + + diff --git a/_i_i_o_manager_8cs.html b/_i_i_o_manager_8cs.html new file mode 100644 index 0000000000..d97c8220a4 --- /dev/null +++ b/_i_i_o_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..f02915c9a9 --- /dev/null +++ b/_i_i_o_manager_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.IO
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 }
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
+ + + + diff --git a/_i_identity_cache_8cs.html b/_i_identity_cache_8cs.html new file mode 100644 index 0000000000..906a00a3e6 --- /dev/null +++ b/_i_identity_cache_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..67fb29ed3b --- /dev/null +++ b/_i_identity_cache_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Security
5 {
9  public interface IIdentityCache
10  {
17  void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry);
18 
24  ISystemIdentity LoadCachedIdentity(User user);
25  }
26 }
+
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + + + + + + +
+ + + + diff --git a/_i_instance_8cs.html b/_i_instance_8cs.html new file mode 100644 index 0000000000..a13672f554 --- /dev/null +++ b/_i_instance_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components
 
+
+ + + + diff --git a/_i_instance_8cs_source.html b/_i_instance_8cs_source.html new file mode 100644 index 0000000000..0ffeb86bcb --- /dev/null +++ b/_i_instance_8cs_source.html @@ -0,0 +1,131 @@ + + + + + + +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 
12 namespace Tgstation.Server.Host.Components
13 {
17  public interface IInstance : IHostedService, IDisposable
18  {
23 
28 
33 
37  IChat Chat { get; }
38 
43 
48  CompileJob LatestCompileJob();
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 }
+ + + + + + + + +
For managing connected chat services
Definition: IChat.cs:13
+ +
For interacting with the instance services
Definition: IInstance.cs:17
+
For managing the BYOND installation
+
For managing the Configuration directory
+ + + + +
Factory for creating and loading IRepositorys
+ + + + + + + + +
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..6b7227265c --- /dev/null +++ b/_i_instance_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5db5121f14 --- /dev/null +++ b/_i_instance_client_8cs_source.html @@ -0,0 +1,123 @@ + + + + + + +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 
4 namespace Tgstation.Server.Client.Components
5 {
9  public interface IInstanceClient
10  {
14  Instance Metadata { get; }
15 
20 
25 
30 
34  IConfigurationClient Configuration { get; }
35 
39  IInstanceUserClient Users { get; }
40 
44  IChatBotsClient ChatBots { get; }
45 
50 
54  IJobsClient Jobs { get; }
55  }
56 }
+
Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile
Definition: DreamMaker.cs:8
+ + + + +
For managing the Byond installation
Definition: IByondClient.cs:11
+ + + + + +
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
+ +
Represents an instance of BYOND&#39;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..1c7d3937ec --- /dev/null +++ b/_i_instance_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..0deef421df --- /dev/null +++ b/_i_instance_factory_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components
4 {
9  {
15  IInstance CreateInstance(Models.Instance metadata);
16  }
17 }
+ +
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..68997e3803 --- /dev/null +++ b/_i_instance_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..0731e9df1f --- /dev/null +++ b/_i_instance_manager_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components
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 }
+ + + +
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..4246d0a383 --- /dev/null +++ b/_i_instance_manager_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..ba64cb9509 --- /dev/null +++ b/_i_instance_manager_client_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
7 namespace Tgstation.Server.Client
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 
58  IInstanceClient CreateClient(Instance instance);
59  }
60 }
+ + + + + + + +
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..fff38d412a --- /dev/null +++ b/_i_instance_user_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e491ee3871 --- /dev/null +++ b/_i_instance_user_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client.Components
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 }
+ + + + +
Represents a Users permissions in an Instance
Definition: InstanceUser.cs:9
+ + +
+ + + + diff --git a/_i_job_manager_8cs.html b/_i_job_manager_8cs.html new file mode 100644 index 0000000000..bff2b5875e --- /dev/null +++ b/_i_job_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..b975a50d06 --- /dev/null +++ b/_i_job_manager_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Core
8 {
12  public interface IJobManager : IHostedService
13  {
17  int? JobProgress(Job job);
18 
26  Task RegisterOperation(Job job, Func<Job, IDatabaseContext, Action<int>, CancellationToken, Task> operation, CancellationToken cancellationToken);
27 
36 #pragma warning disable CA1068 // CancellationToken parameters must come last https://github.com/dotnet/roslyn-analyzers/issues/1816
37  Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken);
38 #pragma warning restore CA1068 // CancellationToken parameters must come last
39 
48  Task<bool> CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken);
49  }
50 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ + + + + + + + + +
+ + + + diff --git a/_i_jobs_client_8cs.html b/_i_jobs_client_8cs.html new file mode 100644 index 0000000000..2594d7c2fd --- /dev/null +++ b/_i_jobs_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..b49a0288d7 --- /dev/null +++ b/_i_jobs_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
7 namespace Tgstation.Server.Client.Components
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 }
+ + + + + + +
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/_i_json_tracking_context_8cs.html b/_i_json_tracking_context_8cs.html new file mode 100644 index 0000000000..cbd2e3243f --- /dev/null +++ b/_i_json_tracking_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..644e4ff24c --- /dev/null +++ b/_i_json_tracking_context_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Components.Chat
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 }
+ + + +
Represents a tracking of dynamic chat json files
+ + + + + +
+ + + + diff --git a/_i_network_prompt_reaper_8cs.html b/_i_network_prompt_reaper_8cs.html new file mode 100644 index 0000000000..198bc91aaf --- /dev/null +++ b/_i_network_prompt_reaper_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..594b6648f8 --- /dev/null +++ b/_i_network_prompt_reaper_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Watchdog
4 {
9  {
14  void RegisterProcess(IProcess process);
15  }
16 }
+ +
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+ +
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
+ + +
+ + + + diff --git a/_i_platform_identifier_8cs.html b/_i_platform_identifier_8cs.html new file mode 100644 index 0000000000..e505d96a8e --- /dev/null +++ b/_i_platform_identifier_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d9650b59b4 --- /dev/null +++ b/_i_platform_identifier_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Core
2 {
6  public interface IPlatformIdentifier
7  {
11  bool IsWindows { get; }
12 
16  string ScriptFileExtension { get; }
17  }
18 }
+
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..dc91331be8 --- /dev/null +++ b/_i_post_write_handler_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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
 
+ + + +

+Namespaces

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..8bc9a0b3be --- /dev/null +++ b/_i_post_write_handler_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.IO
2 {
3  interface IPostWriteHandler
4  {
9  void HandleWrite(string filePath);
10  }
11 }
+ + +
+ + + + diff --git a/_i_process_8cs.html b/_i_process_8cs.html new file mode 100644 index 0000000000..84e2f73aa8 --- /dev/null +++ b/_i_process_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_i_process_8cs_source.html b/_i_process_8cs_source.html new file mode 100644 index 0000000000..98fba6f682 --- /dev/null +++ b/_i_process_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Core
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 }
+ +
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
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..8c9f9f7722 --- /dev/null +++ b/_i_process_base_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d0b2c7d0f3 --- /dev/null +++ b/_i_process_base_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Core
5 {
10  {
14  Task<int> Lifetime { get; }
15 
19  void SetHighPriority();
20  }
21 }
+ +
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..5f2a6fee39 --- /dev/null +++ b/_i_process_executor_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..8996988855 --- /dev/null +++ b/_i_process_executor_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Core
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 }
+ +
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+ +
+ + + + diff --git a/_i_provider_8cs.html b/_i_provider_8cs.html new file mode 100644 index 0000000000..81f646db68 --- /dev/null +++ b/_i_provider_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..c7f4f8fafb --- /dev/null +++ b/_i_provider_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Chat.Providers
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 }
+ +
For interacting with a chat service
Definition: IProvider.cs:11
+ + +
+ + + + diff --git a/_i_provider_factory_8cs.html b/_i_provider_factory_8cs.html new file mode 100644 index 0000000000..36b7388f7c --- /dev/null +++ b/_i_provider_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..f927d1e591 --- /dev/null +++ b/_i_provider_factory_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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..71499e2c68 --- /dev/null +++ b/_i_reattach_info_handler_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IReattachInfoHandler.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IReattachInfoHandler.cs File Reference
+
+ + + + + diff --git a/_i_reattach_info_handler_8cs_source.html b/_i_reattach_info_handler_8cs_source.html new file mode 100644 index 0000000000..3b447efd2f --- /dev/null +++ b/_i_reattach_info_handler_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Watchdog
5 {
9  public interface IReattachInfoHandler
10  {
17  Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken);
18 
24  Task<WatchdogReattachInformation> Load(CancellationToken cancellationToken);
25  }
26 }
+ + +
Handles saving and loading WatchdogReattachInformation
+ +
+ + + + diff --git a/_i_repository_8cs.html b/_i_repository_8cs.html new file mode 100644 index 0000000000..f530008556 --- /dev/null +++ b/_i_repository_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Repository
 
+
+ + + + diff --git a/_i_repository_8cs_source.html b/_i_repository_8cs_source.html new file mode 100644 index 0000000000..ac4ee92a43 --- /dev/null +++ b/_i_repository_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Repository
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 }
+ + +
Represents an on-disk git repository
Definition: IRepository.cs:11
+ +
Represents a git repository
Definition: Repository.cs:8
+
Parameters for creating a TestMerge
+ + + +
+ + + + diff --git a/_i_repository_client_8cs.html b/_i_repository_client_8cs.html new file mode 100644 index 0000000000..f037794c56 --- /dev/null +++ b/_i_repository_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..2cb81ac431 --- /dev/null +++ b/_i_repository_client_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client.Components
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 }
+ + + + +
Represents a git repository
Definition: Repository.cs:8
+ + +
+ + + + diff --git a/_i_repository_manager_8cs.html b/_i_repository_manager_8cs.html new file mode 100644 index 0000000000..f7961d1647 --- /dev/null +++ b/_i_repository_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..64f1e752a1 --- /dev/null +++ b/_i_repository_manager_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Repository
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 }
+ +
Factory for creating and loading IRepositorys
+ + + +
+ + + + diff --git a/_i_request_logger_8cs.html b/_i_request_logger_8cs.html new file mode 100644 index 0000000000..d96e5669ed --- /dev/null +++ b/_i_request_logger_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_i_request_logger_8cs_source.html b/_i_request_logger_8cs_source.html new file mode 100644 index 0000000000..6e4c1e8292 --- /dev/null +++ b/_i_request_logger_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
7 {
11  public interface IRequestLogger
12  {
19  Task LogRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken);
20 
27  Task LogResponse(HttpResponseMessage responseMessage, CancellationToken cancellationToken);
28  }
29 }
+ +
For logging HTTP requests and responses
+ +
+ + + + diff --git a/_i_restart_handler_8cs.html b/_i_restart_handler_8cs.html new file mode 100644 index 0000000000..62ad4d4e79 --- /dev/null +++ b/_i_restart_handler_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..889a588302 --- /dev/null +++ b/_i_restart_handler_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Core
6 {
10  public interface IRestartHandler
11  {
18  Task HandleRestart(Version updateVersion, CancellationToken cancellationToken);
19  }
20 }
+ + + +
+ + + + diff --git a/_i_restart_registration_8cs.html b/_i_restart_registration_8cs.html new file mode 100644 index 0000000000..4fb1327964 --- /dev/null +++ b/_i_restart_registration_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..9abff566e9 --- /dev/null +++ b/_i_restart_registration_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Core
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..03122e6400 --- /dev/null +++ b/_i_server_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host
 
+
+ + + + diff --git a/_i_server_8cs_source.html b/_i_server_8cs_source.html new file mode 100644 index 0000000000..5a484400fc --- /dev/null +++ b/_i_server_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 }
+ +
Represents the host
Definition: IServer.cs:9
+ +
+ + + + diff --git a/_i_server_client_8cs.html b/_i_server_client_8cs.html new file mode 100644 index 0000000000..86b76a432c --- /dev/null +++ b/_i_server_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_i_server_client_8cs_source.html b/_i_server_client_8cs_source.html new file mode 100644 index 0000000000..9d28d78b1b --- /dev/null +++ b/_i_server_client_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
7 {
11  public interface IServerClient : IDisposable
12  {
16  Uri Url { get; }
17 
21  Token Token { get; set; }
22 
26  TimeSpan Timeout { get; set; }
27 
31  IInstanceManagerClient Instances { get; }
32 
37 
41  IUsersClient Users { get; }
42 
46  Task<ServerInformation> Version(CancellationToken cancellationToken);
47 
52  void AddRequestLogger(IRequestLogger requestLogger);
53  }
54 }
+ + + + + +
Main client for communicating with a server
+ +
Represents a JWT returned by the API
Definition: Token.cs:8
+ +
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..60e3d6fd09 --- /dev/null +++ b/_i_server_client_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..42c2bcc418 --- /dev/null +++ b/_i_server_client_factory_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
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
+ + +
+ + + + diff --git a/_i_server_control_8cs.html b/_i_server_control_8cs.html new file mode 100644 index 0000000000..22f0cf2abe --- /dev/null +++ b/_i_server_control_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..9efed90ffd --- /dev/null +++ b/_i_server_control_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Core
7 {
11  public interface IServerControl
12  {
16  bool WatchdogPresent { get; }
17 
25  bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager);
26 
32  IRestartRegistration RegisterForRestart(IRestartHandler handler);
33 
38  Task Restart();
39  }
40 }
+ + + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
Represents the lifetime of a IRestartHandler registration
+ + +
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..2ecdc0ffa8 --- /dev/null +++ b/_i_server_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host
 
+
+ + + + diff --git a/_i_server_factory_8cs_source.html b/_i_server_factory_8cs_source.html new file mode 100644 index 0000000000..4f1355b77f --- /dev/null +++ b/_i_server_factory_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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
+ +
+ + + + diff --git a/_i_session_controller_8cs.html b/_i_session_controller_8cs.html new file mode 100644 index 0000000000..ada1271205 --- /dev/null +++ b/_i_session_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..9d5af8d949 --- /dev/null +++ b/_i_session_controller_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Watchdog
6 {
11  {
15  Task<LaunchResult> LaunchResult { get; }
16 
20  bool IsPrimary { get; }
21 
25  bool TerminationWasRequested { get; }
26 
31 
35  IDmbProvider Dmb { get; }
36 
40  ushort? Port { get; }
41 
45  bool ClosePortOnReboot { get; set; }
46 
51 
55  Task OnReboot { get; }
56 
61  ReattachInformation Release();
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 
95  void EnableCustomChatCommands();
96  }
97 }
Represents the result of trying to start a DD process
Definition: LaunchResult.cs:9
+ + +
Handles communication with a DreamDaemon IProcess
+ +
Represents process lifetime
Definition: IProcessBase.cs:9
+ +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ +
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..8a974d388c --- /dev/null +++ b/_i_session_controller_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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..dd6bfd8643 --- /dev/null +++ b/_i_session_controller_factory_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Watchdog
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 
39  ISessionController CreateDeadSession(IDmbProvider dmbProvider);
40  }
41 }
+ + + + + +
Handles communication with a DreamDaemon IProcess
+ + +
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..050bf005ba --- /dev/null +++ b/_i_setup_wizard_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d100926ce1 --- /dev/null +++ b/_i_setup_wizard_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Core
5 {
9  interface ISetupWizard
10  {
16  Task<bool> CheckRunWizard(CancellationToken cancellationToken);
17  }
18 }
+ +
The command line Configuration setup wizard
Definition: ISetupWizard.cs:9
+ +
+ + + + diff --git a/_i_symlink_factory_8cs.html b/_i_symlink_factory_8cs.html new file mode 100644 index 0000000000..a94e6b8716 --- /dev/null +++ b/_i_symlink_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..3b9d145be2 --- /dev/null +++ b/_i_symlink_factory_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.IO
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..5ad06d3a7d --- /dev/null +++ b/_i_synchronous_i_o_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..ee28e40d63 --- /dev/null +++ b/_i_synchronous_i_o_manager_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.IO
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 }
+ +
For accessing the disk in a synchronous manner
+ +
+ + + + diff --git a/_i_system_identity_8cs.html b/_i_system_identity_8cs.html new file mode 100644 index 0000000000..acf4e0abcf --- /dev/null +++ b/_i_system_identity_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..481577582d --- /dev/null +++ b/_i_system_identity_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Security
7 {
11  public interface ISystemIdentity : IDisposable
12  {
16  string Uid { get; }
17 
21  string Username { get; }
22 
27  ISystemIdentity Clone();
28 
35  Task RunImpersonated(Action action, CancellationToken cancellationToken);
36  }
37 }
+
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + + +
+ + + + diff --git a/_i_system_identity_factory_8cs.html b/_i_system_identity_factory_8cs.html new file mode 100644 index 0000000000..58b1ccdf84 --- /dev/null +++ b/_i_system_identity_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ISystemIdentityFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISystemIdentityFactory.cs File Reference
+
+ + + + + diff --git a/_i_system_identity_factory_8cs_source.html b/_i_system_identity_factory_8cs_source.html new file mode 100644 index 0000000000..9cc96cff77 --- /dev/null +++ b/_i_system_identity_factory_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Security
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 }
+ + + + + + + +
+ + + + diff --git a/_i_token_factory_8cs.html b/_i_token_factory_8cs.html new file mode 100644 index 0000000000..e4d426dd8a --- /dev/null +++ b/_i_token_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5f39a106dc --- /dev/null +++ b/_i_token_factory_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Security
7 {
11  public interface ITokenFactory
12  {
16  TokenValidationParameters ValidationParameters { get; }
17 
24  Task<Token> CreateToken(Models.User user, CancellationToken cancellationToken);
25  }
26 }
+ + + + + + +
+ + + + diff --git a/_i_users_client_8cs.html b/_i_users_client_8cs.html new file mode 100644 index 0000000000..5df75fbcf6 --- /dev/null +++ b/_i_users_client_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_i_users_client_8cs_source.html b/_i_users_client_8cs_source.html new file mode 100644 index 0000000000..2888a6efee --- /dev/null +++ b/_i_users_client_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
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 }
+ + + + + + +
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..b9d91486cf --- /dev/null +++ b/_identity_cache_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IdentityCache.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IdentityCache.cs File Reference
+
+ + + + + diff --git a/_identity_cache_8cs_source.html b/_identity_cache_8cs_source.html new file mode 100644 index 0000000000..8c476a4996 --- /dev/null +++ b/_identity_cache_8cs_source.html @@ -0,0 +1,127 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Security
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  identCache = new IdentityCacheObject(systemIdentity.Clone(), asyncDelayer, () =>
67  {
68  logger.LogDebug("Expiring system identity cache for user {1}", uid, user.Id);
69  lock (cachedIdentities)
70  cachedIdentities.Remove(user.Id);
71  }, expiry);
72  cachedIdentities.Add(user.Id, identCache);
73  }
74  }
75 
78  {
79  if (user == null)
80  throw new ArgumentNullException(nameof(user));
81  lock (cachedIdentities)
82  if (cachedIdentities.TryGetValue(user.Id, out var identity))
83  return identity.SystemIdentity.Clone();
84  throw new InvalidOperationException("Cached system identity has expired!");
85  }
86  }
87 }
+
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 &#39;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..5ef020cb78 --- /dev/null +++ b/_identity_cache_object_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..0cff3ac264 --- /dev/null +++ b/_identity_cache_object_8cs_source.html @@ -0,0 +1,118 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Security
7 {
12  {
16  public ISystemIdentity SystemIdentity { get; }
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
+ +
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..589129951a --- /dev/null +++ b/_instance_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/InstanceClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceClient.cs File Reference
+
+ + + + + diff --git a/_instance_client_8cs_source.html b/_instance_client_8cs_source.html new file mode 100644 index 0000000000..e55f55d420 --- /dev/null +++ b/_instance_client_8cs_source.html @@ -0,0 +1,135 @@ + + + + + + +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 
4 namespace Tgstation.Server.Client.Components
5 {
8  {
10  public Instance Metadata { get; }
11 
13  public IByondClient Byond { get; }
14 
16  public IRepositoryClient Repository { get; }
17 
20 
22  public IConfigurationClient Configuration { get; }
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 
46  public InstanceClient(IApiClient apiClient, Instance instance)
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  }
60  }
61 }
+
Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current 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&#39;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..49473fde4d --- /dev/null +++ b/_instance_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/InstanceController.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceController.cs File Reference
+
+ + + + + diff --git a/_instance_controller_8cs_source.html b/_instance_controller_8cs_source.html new file mode 100644 index 0000000000..85656f8e64 --- /dev/null +++ b/_instance_controller_8cs_source.html @@ -0,0 +1,173 @@ + + + + + + +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 
23 namespace Tgstation.Server.Host.Controllers
24 {
28  [Route(Routes.InstanceManager)]
29  public sealed class InstanceController : ModelController<Api.Models.Instance>
30  {
34  const string InstanceAttachFileName = "TGS4_ALLOW_INSTANCE_ATTACH";
35 
36  const string MoveInstanceJobPrefix = "Move instance ID ";
37 
42 
47 
52 
57 
62 
74  public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger<InstanceController> logger) : base(databaseContext, authenticationContextFactory, logger, false)
75  {
76  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
77  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
78  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
79  this.application = application ?? throw new ArgumentNullException(nameof(application));
80  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
81  }
82 
83  void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
84  {
85  if (model.Path == null)
86  {
87  absolutePath = null;
88  return;
89  }
90  absolutePath = ioManager.ResolvePath(model.Path);
91  if (platformIdentifier.IsWindows)
92  model.Path = absolutePath.ToUpperInvariant();
93  else
94  model.Path = absolutePath;
95  }
96 
97  Models.InstanceUser InstanceAdminUser() => new Models.InstanceUser
98  {
99  ByondRights = (ByondRights)~0U,
106  UserId = AuthenticationContext.User.Id
107  };
108 
110  [TgsAuthorize(InstanceManagerRights.Create)]
111  public override async Task<IActionResult> Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
112  {
113  if (model == null)
114  throw new ArgumentNullException(nameof(model));
115 
116  if (String.IsNullOrWhiteSpace(model.Name))
117  return BadRequest(new ErrorMessage { Message = "name must not be empty!" });
118 
119  if (model.Path == null)
120  return BadRequest(new ErrorMessage { Message = "path must not be empty!" });
121 
122  NormalizeModelPath(model, out var rawPath);
123 
124  var localPath = ioManager.ResolvePath(".");
125  NormalizeModelPath(new Api.Models.Instance
126  {
127  Path = localPath
128  }, out var normalizedLocalPath);
129 
130  if (rawPath.StartsWith(normalizedLocalPath, StringComparison.Ordinal))
131  return Conflict("Instances cannot be created in the installation directory!");
132 
133 
134  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
135  bool attached = false;
136  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
137  if (!await ioManager.FileExists(ioManager.ConcatPath(model.Path, InstanceAttachFileName), cancellationToken).ConfigureAwait(false))
138  return Conflict(new ErrorMessage { Message = "Path not empty!" });
139  else
140  attached = true;
141 
142  var newInstance = new Models.Instance
143  {
144  ConfigurationType = model.ConfigurationType ?? ConfigurationType.Disallowed,
146  {
147  AllowWebClient = false,
148  AutoStart = false,
149  PrimaryPort = 1337,
150  SecondaryPort = 1338,
151  SecurityLevel = DreamDaemonSecurity.Safe,
152  SoftRestart = false,
153  SoftShutdown = false,
154  StartupTimeout = 20
155  },
157  {
158  ApiValidationPort = 1339,
159  ApiValidationSecurityLevel = DreamDaemonSecurity.Safe
160  },
161  Name = model.Name,
162  Online = false,
163  Path = model.Path,
164  AutoUpdateInterval = model.AutoUpdateInterval ?? 0,
166  {
167  CommitterEmail = "tgstation-server@users.noreply.github.com",
168  CommitterName = application.VersionPrefix,
169  PushTestMergeCommits = false,
170  ShowTestMergeCommitters = false,
171  AutoUpdatesKeepTestMerges = false,
172  AutoUpdatesSynchronize = false
173  },
174  //give this user full privileges on the instance
175  InstanceUsers = new List<Models.InstanceUser>
176  {
177  InstanceAdminUser()
178  }
179  };
180 
181  DatabaseContext.Instances.Add(newInstance);
182  try
183  {
184  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
185 
186  try
187  {
188  //actually reserve it now
189  await ioManager.CreateDirectory(rawPath, cancellationToken).ConfigureAwait(false);
190  await ioManager.DeleteFile(ioManager.ConcatPath(rawPath, InstanceAttachFileName), cancellationToken).ConfigureAwait(false);
191  }
192  catch
193  {
194  //oh shit delete the model
195  DatabaseContext.Instances.Remove(newInstance);
196 
197  await DatabaseContext.Save(default).ConfigureAwait(false);
198  throw;
199  }
200  }
201  catch (IOException e)
202  {
203  return Conflict(new ErrorMessage { Message = e.Message });
204  }
205  catch (DbUpdateException e)
206  {
207  return Conflict(new ErrorMessage { Message = e.Message });
208  }
209 
210  Logger.LogInformation("{0} {1} instance {2}: {3} ({4})", AuthenticationContext.User.Name, attached ? "attached" : "created", newInstance.Name, newInstance.Id, newInstance.Path);
211 
212  var api = newInstance.ToApi();
213  return attached ? (IActionResult)Json(api) : StatusCode((int)HttpStatusCode.Created, api);
214  }
215 
217  [TgsAuthorize(InstanceManagerRights.Delete)]
218  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
219  {
220  var originalModel = await DatabaseContext.Instances.Where(x => x.Id == id)
221  .Include(x => x.WatchdogReattachInformation)
222  .Include(x => x.WatchdogReattachInformation.Alpha)
223  .Include(x => x.WatchdogReattachInformation.Bravo)
224  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
225  if (originalModel == default)
226  return StatusCode((int)HttpStatusCode.Gone);
227  if (originalModel.Online.Value)
228  return Conflict(new ErrorMessage
229  {
230  Message = "Cannot detach an online instance!"
231  });
232 
233  if (originalModel.WatchdogReattachInformation != null)
234  {
235  DatabaseContext.WatchdogReattachInformations.Remove(originalModel.WatchdogReattachInformation);
236  if (originalModel.WatchdogReattachInformation.Alpha != null)
237  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Alpha);
238  if (originalModel.WatchdogReattachInformation.Bravo != null)
239  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Bravo);
240  }
241 
242  DatabaseContext.Instances.Remove(originalModel);
243 
244  var attachFileName = ioManager.ConcatPath(originalModel.Path, InstanceAttachFileName);
245  await ioManager.WriteAllBytes(attachFileName, Array.Empty<byte>(), default).ConfigureAwait(false);
246  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); //cascades everything
247  return Ok();
248  }
249 
251  [TgsAuthorize(InstanceManagerRights.Relocate | InstanceManagerRights.Rename | InstanceManagerRights.SetAutoUpdate | InstanceManagerRights.SetConfiguration | InstanceManagerRights.SetOnline)]
252  public override async Task<IActionResult> Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
253  {
254  var instanceQuery = DatabaseContext.Instances.Where(x => x.Id == model.Id);
255 
256  var moveJob = await instanceQuery
257  .SelectMany(x => x.Jobs).
258 #pragma warning disable CA1307 // Specify StringComparison
259  Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
260 #pragma warning restore CA1307 // Specify StringComparison
261  .Select(x => new Models.Job
262  {
263  Id = x.Id
264  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
265 
266  if (moveJob != default)
267  //cancel it now
268  await jobManager.CancelJob(moveJob, AuthenticationContext.User, true, cancellationToken).ConfigureAwait(false);
269 
270  var usersInstanceUserTask = instanceQuery.SelectMany(x => x.InstanceUsers).Where(x => x.UserId == AuthenticationContext.User.Id).FirstOrDefaultAsync(cancellationToken);
271 
272  var originalModel = await instanceQuery
273  .Include(x => x.RepositorySettings)
274  .Include(x => x.ChatSettings)
275  .ThenInclude(x => x.Channels)
276  .Include(x => x.DreamDaemonSettings) //need these for onlining
277  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
278  if (originalModel == default(Models.Instance))
279  return StatusCode((int)HttpStatusCode.Gone);
280 
281  var userRights = (InstanceManagerRights)AuthenticationContext.GetRight(RightsType.InstanceManager);
282  bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression, InstanceManagerRights requiredRight)
283  {
284  var memberSelectorExpression = (MemberExpression)expression.Body;
285  var property = (PropertyInfo)memberSelectorExpression.Member;
286 
287  var newVal = property.GetValue(model);
288  if (newVal == null)
289  return false;
290  if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
291  return true;
292 
293  property.SetValue(originalModel, newVal);
294  return false;
295  };
296 
297  string originalModelPath = null;
298  string rawPath = null;
299  if (model.Path != null)
300  {
301  NormalizeModelPath(model, out rawPath);
302 
303  if (model.Path != originalModel.Path)
304  {
305  if (!userRights.HasFlag(InstanceManagerRights.Relocate))
306  return Forbid();
307  if (originalModel.Online.Value && model.Online != true)
308  return Conflict(new ErrorMessage { Message = "Cannot relocate an online instance!" });
309 
310  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
311  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
312  return Conflict(new ErrorMessage { Message = "Path not empty!" });
313 
314  originalModelPath = originalModel.Path;
315  originalModel.Path = model.Path;
316  }
317  }
318 
319  var oldAutoUpdateInterval = originalModel.AutoUpdateInterval.Value;
320  var originalOnline = originalModel.Online.Value;
321  var renamed = model.Name != null && originalModel.Name != model.Name;
322 
323  if (CheckModified(x => x.AutoUpdateInterval, InstanceManagerRights.SetAutoUpdate)
324  || CheckModified(x => x.ConfigurationType, InstanceManagerRights.SetConfiguration)
325  || CheckModified(x => x.Name, InstanceManagerRights.Rename)
326  || CheckModified(x => x.Online, InstanceManagerRights.SetOnline))
327  return Forbid();
328 
329  //ensure the current user has write privilege on the instance
330  var usersInstanceUser = await usersInstanceUserTask.ConfigureAwait(false);
331  if (usersInstanceUser == default)
332  {
333  var instanceAdminUser = InstanceAdminUser();
334  instanceAdminUser.InstanceId = originalModel.Id;
335  DatabaseContext.InstanceUsers.Add(instanceAdminUser);
336  }
337  else
338  usersInstanceUser.InstanceUserRights |= InstanceUserRights.WriteUsers;
339 
340  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
341 
342  if (renamed)
343  instanceManager.GetInstance(originalModel).Rename(originalModel.Name);
344 
345  var oldAutoStart = originalModel.DreamDaemonSettings.AutoStart;
346  try
347  {
348  if (originalOnline && model.Online == false)
349  await instanceManager.OfflineInstance(originalModel, AuthenticationContext.User, cancellationToken).ConfigureAwait(false);
350  else if (!originalOnline && model.Online == true)
351  {
352  //force autostart false here because we don't want any long running jobs right now
353  //remember to document this
354  originalModel.DreamDaemonSettings.AutoStart = false;
355  await instanceManager.OnlineInstance(originalModel, cancellationToken).ConfigureAwait(false);
356  }
357  }
358  catch (Exception e)
359  {
360  if(!(e is OperationCanceledException))
361  Logger.LogError("Error changing instance online state! Exception: {0}", e);
362  originalModel.Online = originalOnline;
363  originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
364  if (originalModelPath != null)
365  originalModel.Path = originalModelPath;
366  await DatabaseContext.Save(default).ConfigureAwait(false);
367  throw;
368  }
369 
370  var api = (AuthenticationContext.GetRight(RightsType.InstanceManager) & (ulong)InstanceManagerRights.Read) != 0 ? originalModel.ToApi() : new Api.Models.Instance
371  {
372  Id = originalModel.Id
373  };
374  if (originalModelPath != null)
375  {
376  var job = new Models.Job
377  {
378  Description = String.Format(CultureInfo.InvariantCulture, MoveInstanceJobPrefix + "{0} from {1} to {2}", originalModel.Id, originalModel.Path, rawPath),
379  Instance = originalModel,
380  CancelRightsType = RightsType.InstanceManager,
381  CancelRight = (ulong)InstanceManagerRights.Relocate,
382  StartedBy = AuthenticationContext.User
383  };
384 
385  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => instanceManager.MoveInstance(originalModel, rawPath, ct), cancellationToken).ConfigureAwait(false);
386  api.MoveJob = job.ToApi();
387  }
388 
389  if (originalModel.Online.Value && model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval)
390  await instanceManager.GetInstance(originalModel).SetAutoUpdateInterval(model.AutoUpdateInterval.Value).ConfigureAwait(false);
391 
392  return Json(api);
393  }
394 
396  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
397  public override async Task<IActionResult> List(CancellationToken cancellationToken)
398  {
399  IQueryable<Models.Instance> query = DatabaseContext.Instances;
401  query = query.Where(x => x.InstanceUsers.Any(y => y.UserId == AuthenticationContext.User.Id)).Where(x => x.InstanceUsers.Any(y => y.AnyRights));
402 
403  var moveJobTasks = query
404  .SelectMany(x => x.Jobs)
405 #pragma warning disable CA1307 // Specify StringComparison
406  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
407 #pragma warning restore CA1307 // Specify StringComparison
408  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
409  .Include(x => x.Instance)
410  .ToListAsync(cancellationToken);
411  var instances = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
412  var apis = instances.Select(x => x.ToApi());
413  var moveJobs = await moveJobTasks.ConfigureAwait(false);
414  foreach(var I in moveJobs)
415  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
416  return Json(apis);
417  }
418 
420  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
421  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
422  {
423  var query = DatabaseContext.Instances.Where(x => x.Id == id);
424  var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
425 
426  if (cantList)
427  query = query.Include(x => x.InstanceUsers);
428 
429  var moveJobTask = query
430  .SelectMany(x => x.Jobs)
431 #pragma warning disable CA1307 // Specify StringComparison
432  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
433 #pragma warning restore CA1307 // Specify StringComparison
434  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
435  .FirstOrDefaultAsync(cancellationToken);
436  var instance = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
437 
438  if (instance == null)
439  return StatusCode((int)HttpStatusCode.Gone);
440 
441  if (cantList && !instance.InstanceUsers.Any(x => x.UserId == AuthenticationContext.User.Id && x.AnyRights))
442  return Forbid();
443 
444  var api = instance.ToApi();
445  api.MoveJob = (await moveJobTask.ConfigureAwait(false))?.ToApi();
446  return Json(api);
447  }
448  }
449 }
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
+ + +
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
DbSet< ReattachInformation > ReattachInformations
+ +
InstanceUserRights
Rights for an Models.Instance
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ +
InstanceManagerRights InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+
readonly IInstanceManager instanceManager
The IInstanceManager for the InstanceController
+
readonly IApplication application
The IApplication for the InstanceController
+ + + + + +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ConfigurationType
The type of configuration allowed on an Instance
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
Controller for managing Components.Instances
+ +
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
+
InstanceManagerRights
Rights for managing Models.Instances
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
DreamMakerRights
Rights for Models.DreamMaker
+ + +
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
+ +
const string InstanceManager
The Models.Instance controller
Definition: Routes.cs:29
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceController
+ +
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&#39;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
+
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
+ + + + + +
+ + + + diff --git a/_instance_factory_8cs.html b/_instance_factory_8cs.html new file mode 100644 index 0000000000..5e626d393c --- /dev/null +++ b/_instance_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/InstanceFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceFactory.cs File Reference
+
+ + + + + diff --git a/_instance_factory_8cs_source.html b/_instance_factory_8cs_source.html new file mode 100644 index 0000000000..6c30cdbf97 --- /dev/null +++ b/_instance_factory_8cs_source.html @@ -0,0 +1,170 @@ + + + + + + +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 
16 namespace Tgstation.Server.Host.Components
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 
132  public 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)
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  public IInstance CreateInstance(Models.Instance metadata)
156  {
157  //Create the ioManager for the instance
158  var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
159 
160  //various other ioManagers
161  var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
162  var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
163  var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
164  var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
165 
166  var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, platformIdentifier, loggerFactory.CreateLogger<StaticFiles.Configuration>());
167  var eventConsumer = new EventConsumer(configuration);
168 
169  var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, loggerFactory.CreateLogger<DmbFactory>(), metadata.CloneMetadata());
170  try
171  {
172  var repoManager = new RepositoryManager(metadata.RepositorySettings, repoIoManager, eventConsumer, credentialsProvider, loggerFactory.CreateLogger<Repository.Repository>(), loggerFactory.CreateLogger<RepositoryManager>());
173  try
174  {
175  var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());
176 
177  var commandFactory = new CommandFactory(application, byond, repoManager, databaseContextFactory, metadata);
178 
179  var chat = chatFactory.CreateChat(instanceIoManager, commandFactory, metadata.ChatSettings);
180  try
181  {
182  var sessionControllerFactory = new SessionControllerFactory(processExecutor, byond, byondTopicSender, cryptographySuite, application, gameIoManager, chat, networkPromptReaper, platformIdentifier, loggerFactory, metadata.CloneMetadata());
183  var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, loggerFactory.CreateLogger<ReattachInfoHandler>(), metadata.CloneMetadata());
184  var watchdog = watchdogFactory.CreateWatchdog(chat, dmbFactory, reattachInfoHandler, configuration, sessionControllerFactory, metadata.CloneMetadata(), metadata.DreamDaemonSettings);
185  eventConsumer.SetWatchdog(watchdog);
186  commandFactory.SetWatchdog(watchdog);
187  try
188  {
189  var dreamMaker = new DreamMaker(byond, gameIoManager, configuration, sessionControllerFactory, dmbFactory, application, eventConsumer, chat, processExecutor, watchdog, loggerFactory.CreateLogger<DreamMaker>());
190 
191  return new Instance(metadata.CloneMetadata(), repoManager, byond, dreamMaker, watchdog, chat, configuration, dmbFactory, databaseContextFactory, dmbFactory, jobManager, eventConsumer, gitHubClientFactory, loggerFactory.CreateLogger<Instance>());
192  }
193  catch
194  {
195  watchdog.Dispose();
196  throw;
197  }
198  }
199  catch
200  {
201  chat.Dispose();
202  throw;
203  }
204  }
205  catch
206  {
207  repoManager.Dispose();
208  throw;
209  }
210  }
211  catch
212  {
213  dmbFactory.Dispose();
214  throw;
215  }
216  }
217 
219  public Task StartAsync(CancellationToken cancellationToken) => byondInstaller.CleanCache(cancellationToken);
220 
222  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
223  }
224 }
+
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
+ + + +
+ +
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that ...
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ + + +
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:118
+
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
+ + + + + +
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(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it
+
For identifying the current platform
+ + + + + + +
+ + + + diff --git a/_instance_manager_8cs.html b/_instance_manager_8cs.html new file mode 100644 index 0000000000..157874e18a --- /dev/null +++ b/_instance_manager_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/InstanceManager.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceManager.cs File Reference
+
+ + + + + diff --git a/_instance_manager_8cs_source.html b/_instance_manager_8cs_source.html new file mode 100644 index 0000000000..6a6f34db52 --- /dev/null +++ b/_instance_manager_8cs_source.html @@ -0,0 +1,136 @@ + + + + + + +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 
12 namespace Tgstation.Server.Host.Components
13 {
16  {
21 
26 
31 
36 
41 
45  readonly ILogger<InstanceManager> logger;
46 
50  readonly Dictionary<long, IInstance> instances;
51 
55  bool disposed;
56 
66  public InstanceManager(IInstanceFactory instanceFactory, IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, IJobManager jobManager, ILogger<InstanceManager> logger)
67  {
68  this.instanceFactory = instanceFactory ?? throw new ArgumentNullException(nameof(instanceFactory));
69  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
70  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
71  this.application = application ?? throw new ArgumentNullException(nameof(application));
72  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
73  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
74 
75  instances = new Dictionary<long, IInstance>();
76  }
77 
79  public void Dispose()
80  {
81  lock (this)
82  {
83  if (disposed)
84  return;
85  disposed = true;
86  }
87  foreach (var I in instances)
88  I.Value.Dispose();
89  }
90 
92  public IInstance GetInstance(Models.Instance metadata)
93  {
94  if (metadata == null)
95  throw new ArgumentNullException(nameof(metadata));
96  lock (this)
97  {
98  if (!instances.TryGetValue(metadata.Id, out IInstance instance))
99  throw new InvalidOperationException("Instance not online!");
100  return instance;
101  }
102  }
103 
105  public async Task MoveInstance(Models.Instance instance, string newPath, CancellationToken cancellationToken)
106  {
107  if (newPath == null)
108  throw new ArgumentNullException(nameof(newPath));
109  if (instance.Online.Value)
110  throw new InvalidOperationException("Cannot move an online instance!");
111  var oldPath = instance.Path;
112  await ioManager.CopyDirectory(oldPath, newPath, null, cancellationToken).ConfigureAwait(false);
113  await databaseContextFactory.UseContext(db =>
114  {
115  var targetInstance = new Models.Instance
116  {
117  Id = instance.Id
118  };
119  db.Instances.Attach(targetInstance);
120  targetInstance.Path = newPath;
121  return db.Save(cancellationToken);
122  }).ConfigureAwait(false);
123  await ioManager.DeleteDirectory(oldPath, cancellationToken).ConfigureAwait(false);
124  }
125 
127  public async Task OfflineInstance(Models.Instance metadata, Models.User user, CancellationToken cancellationToken)
128  {
129  if (metadata == null)
130  throw new ArgumentNullException(nameof(metadata));
131  logger.LogInformation("Offlining instance ID {0}", metadata.Id);
132  IInstance instance;
133  lock (this)
134  {
135  if (!instances.TryGetValue(metadata.Id, out instance))
136  throw new InvalidOperationException("Instance not online!");
137  instances.Remove(metadata.Id);
138  }
139  try
140  {
141  //we are the one responsible for cancelling his jobs
142  var tasks = new List<Task>();
143  await databaseContextFactory.UseContext(async db =>
144  {
145  var jobs = db.Jobs.Where(x => x.Instance.Id == metadata.Id).Select(x => new Models.Job
146  {
147  Id = x.Id
148  }).ToAsyncEnumerable();
149  await jobs.ForEachAsync(job =>
150  {
151  lock (tasks)
152  tasks.Add(jobManager.CancelJob(job, user, true, cancellationToken));
153  }, cancellationToken).ConfigureAwait(false);
154  }).ConfigureAwait(false);
155 
156  await Task.WhenAll(tasks).ConfigureAwait(false);
157 
158  await instance.StopAsync(cancellationToken).ConfigureAwait(false);
159  }
160  finally
161  {
162  instance.Dispose();
163  }
164  }
165 
167  public async Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)
168  {
169  if (metadata == null)
170  throw new ArgumentNullException(nameof(metadata));
171  logger.LogInformation("Onlining instance ID {0} ({1}) at {2}", metadata.Id, metadata.Name, metadata.Path);
172  var instance = instanceFactory.CreateInstance(metadata);
173  try
174  {
175  lock (this)
176  {
177  if (instances.ContainsKey(metadata.Id))
178  throw new InvalidOperationException("Instance already online!");
179  instances.Add(metadata.Id, instance);
180  }
181  }
182  catch
183  {
184  instance.Dispose();
185  throw;
186  }
187  await instance.StartAsync(cancellationToken).ConfigureAwait(false);
188  }
189 
191  public Task StartAsync(CancellationToken cancellationToken) => databaseContextFactory.UseContext(async databaseContext =>
192  {
193  try
194  {
195  var factoryStartup = instanceFactory.StartAsync(cancellationToken);
196  await databaseContext.Initialize(cancellationToken).ConfigureAwait(false);
197  await jobManager.StartAsync(cancellationToken).ConfigureAwait(false);
198  var dbInstances = databaseContext.Instances.Where(x => x.Online.Value)
199  .Include(x => x.RepositorySettings)
200  .Include(x => x.ChatSettings)
201  .ThenInclude(x => x.Channels)
202  .Include(x => x.DreamDaemonSettings)
203  .ToAsyncEnumerable();
204  var tasks = new List<Task>();
205  await factoryStartup.ConfigureAwait(false);
206  await dbInstances.ForEachAsync(metadata => tasks.Add(metadata.Online.Value ? OnlineInstance(metadata, cancellationToken) : Task.CompletedTask), cancellationToken).ConfigureAwait(false);
207  await Task.WhenAll(tasks).ConfigureAwait(false);
208  logger.LogInformation("Instance manager ready!");
209  application.Ready(null);
210  }
211  catch (OperationCanceledException)
212  {
213  logger.LogInformation("Cancelled instance manager initialization!");
214  }
215  catch (Exception e)
216  {
217  logger.LogCritical("Instance manager startup error! Exception: {0}", e);
218  application.Ready(e);
219  }
220  });
221 
223  public async Task StopAsync(CancellationToken cancellationToken)
224  {
225  await jobManager.StopAsync(cancellationToken).ConfigureAwait(false);
226  await Task.WhenAll(instances.Select(x => x.Value.StopAsync(cancellationToken))).ConfigureAwait(false);
227  await instanceFactory.StopAsync(cancellationToken).ConfigureAwait(false);
228  }
229  }
230 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ +
async Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)
Online an IInstance
+ +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
bool disposed
If the InstanceManager has been Disposed
+
async Task OfflineInstance(Models.Instance metadata, Models.User user, CancellationToken cancellationToken)
+ + +
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceManager
+
readonly IJobManager jobManager
The IJobManager for the InstanceManager
+
For interacting with the instance services
Definition: IInstance.cs:17
+ +
async Task StopAsync(CancellationToken cancellationToken)
+
InstanceManager(IInstanceFactory instanceFactory, IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, IJobManager jobManager, ILogger< InstanceManager > logger)
Construct an 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
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
async Task MoveInstance(Models.Instance instance, string newPath, CancellationToken cancellationToken)
Move an IInstance
+ + + +
+ + + + diff --git a/_instance_manager_client_8cs.html b/_instance_manager_client_8cs.html new file mode 100644 index 0000000000..98b87f8c01 --- /dev/null +++ b/_instance_manager_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_instance_manager_client_8cs_source.html b/_instance_manager_client_8cs_source.html new file mode 100644 index 0000000000..db05b4e684 --- /dev/null +++ b/_instance_manager_client_8cs_source.html @@ -0,0 +1,126 @@ + + + + + + +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 
9 namespace Tgstation.Server.Client
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  return client;
59  }
60  }
61 }
+ + + + + +
IInstanceClient CreateClient(Instance instance)
Create an IInstanceClient for a given Instance
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
readonly IApiClient apiClient
The IApiClient for the InstanceManagerClient
+
InstanceManagerClient(IApiClient apiClient)
Construct an InstanceManagerClient
+ +
readonly Dictionary< long, IInstanceClient > cachedClients
Map of already created IInstanceClients
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+ +
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
+
static string List(string route)
Get the /List postfix for a route
+ +
Web interface for the API
Definition: IApiClient.cs:11
+ +
+ + + + diff --git a/_instance_manager_rights_8cs.html b/_instance_manager_rights_8cs.html new file mode 100644 index 0000000000..168a934208 --- /dev/null +++ b/_instance_manager_rights_8cs.html @@ -0,0 +1,134 @@ + + + + + + +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..2aa9dd2497 --- /dev/null +++ b/_instance_manager_rights_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum InstanceManagerRights : ulong
10  {
14  None = 0,
18  Read = 1,
22  Create = 2,
26  Rename = 4,
30  Relocate = 8,
34  SetOnline = 16,
38  Delete = 32,
42  List = 64,
46  SetConfiguration = 128,
50  SetAutoUpdate = 256
51  }
52 }
+ + +
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..3c472f677d --- /dev/null +++ b/_instance_manager_test_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Tests
 
+
+ + + + diff --git a/_instance_manager_test_8cs_source.html b/_instance_manager_test_8cs_source.html new file mode 100644 index 0000000000..40ecfc2107 --- /dev/null +++ b/_instance_manager_test_8cs_source.html @@ -0,0 +1,127 @@ + + + + + + +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 
21  public InstanceManagerTest(IInstanceManagerClient instanceManagerClient, string testRootPath)
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
+ + + + +
ConfigurationType
The type of configuration allowed on an Instance
+
Controller for managing Components.Instances
+ +
async Task Run(CancellationToken cancellationToken)
+ + + + +
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)
+ + + +
+ + + + diff --git a/_instance_test_8cs.html b/_instance_test_8cs.html new file mode 100644 index 0000000000..c2d6b72d67 --- /dev/null +++ b/_instance_test_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/InstanceTest.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceTest.cs File Reference
+
+ + + + + diff --git a/_instance_test_8cs_source.html b/_instance_test_8cs_source.html new file mode 100644 index 0000000000..968d009666 --- /dev/null +++ b/_instance_test_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
6 namespace Tgstation.Server.Tests.Instance
7 {
8  sealed class InstanceTest
9  {
11 
12  public InstanceTest(IInstanceClient instanceClient)
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);
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  }
26  }
27 }
+
async Task RunTests(CancellationToken cancellationToken)
Definition: InstanceTest.cs:17
+ + + + + + + +
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..dbd5f453ab --- /dev/null +++ b/_instance_user_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/InstanceUserClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceUserClient.cs File Reference
+
+ + + + + diff --git a/_instance_user_client_8cs_source.html b/_instance_user_client_8cs_source.html new file mode 100644 index 0000000000..e88b5abec3 --- /dev/null +++ b/_instance_user_client_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client.Components
9 {
12  {
20  readonly Instance instance;
21 
27  public InstanceUserClient(IApiClient apiClient, Instance instance)
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
32 
34  public Task<InstanceUser> Create(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Create<InstanceUser, InstanceUser>(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken);
35 
36  public Task Delete(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.InstanceUser, instanceUser.UserId.Value), instance.Id, cancellationToken);
37 
39  public Task<InstanceUser> Read(CancellationToken cancellationToken) => apiClient.Read<InstanceUser>(Routes.InstanceUser, instance.Id, cancellationToken);
40 
42  public Task<InstanceUser> Update(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Update<InstanceUser, InstanceUser>(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken);
43 
45  public Task<IReadOnlyList<InstanceUser>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<InstanceUser>>(Routes.List(Routes.InstanceUser), instance.Id, cancellationToken);
46 
48  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);
49  }
50 }
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
+ +
InstanceUserClient(IApiClient apiClient, Instance instance)
Construct an InstanceUserClient
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
Represents a Users permissions in an Instance
Definition: InstanceUser.cs:9
+ +
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
+
long UserId
The Internal.User.Id of the User the InstanceUser belongs to
Definition: InstanceUser.cs:15
+ +
+ + + + diff --git a/_instance_user_controller_8cs.html b/_instance_user_controller_8cs.html new file mode 100644 index 0000000000..c26df40302 --- /dev/null +++ b/_instance_user_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..571ffac591 --- /dev/null +++ b/_instance_user_controller_8cs_source.html @@ -0,0 +1,147 @@ + + + + + + +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 
16 namespace Tgstation.Server.Host.Controllers
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  public override async Task<IActionResult> Update([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
79  {
80  var test = StandardModelChecks(model);
81  if (test != null)
82  return test;
83 
84  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);
85  if (originalUser == null)
86  return StatusCode((int)HttpStatusCode.Gone);
87 
88  originalUser.ByondRights = model.ByondRights ?? originalUser.ByondRights;
89  originalUser.RepositoryRights = model.RepositoryRights ?? originalUser.RepositoryRights;
90  originalUser.InstanceUserRights = model.InstanceUserRights ?? originalUser.InstanceUserRights;
91  originalUser.ChatBotRights = model.ChatBotRights ?? originalUser.ChatBotRights;
92  originalUser.ConfigurationRights = model.ConfigurationRights ?? originalUser.ConfigurationRights;
93  originalUser.DreamDaemonRights = model.DreamDaemonRights ?? originalUser.DreamDaemonRights;
94  originalUser.DreamMakerRights = model.DreamMakerRights ?? originalUser.DreamMakerRights;
95 
96  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
97  return Json(originalUser.UserId == AuthenticationContext.User.Id || (AuthenticationContext.GetRight(RightsType.InstanceUser) & (ulong)InstanceUserRights.ReadUsers) != 0 ? originalUser.ToApi() : new Api.Models.InstanceUser
98  {
99  UserId = originalUser.UserId
100  });
101  }
102 
104  [TgsAuthorize]
105  public override Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult(AuthenticationContext.InstanceUser != null ? (IActionResult)Json(AuthenticationContext.InstanceUser.ToApi()) : NotFound());
106 
108  [TgsAuthorize(InstanceUserRights.ReadUsers)]
109  public override async Task<IActionResult> List(CancellationToken cancellationToken)
110  {
111  var users = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).ToListAsync(cancellationToken).ConfigureAwait(false);
112  return Json(users.Select(x => x.ToApi()));
113  }
114 
116  [TgsAuthorize(InstanceUserRights.ReadUsers)]
117  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
118  {
119  //this functions as userId
120  var user = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
121  if (user == default)
122  return StatusCode((int)HttpStatusCode.Gone);
123  return Json(user.ToApi());
124  }
125 
127  [TgsAuthorize(InstanceUserRights.WriteUsers)]
128  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
129  {
130  await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).DeleteAsync(cancellationToken).ConfigureAwait(false);
131  return Ok();
132  }
133  }
134 }
InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger< InstanceUserController > logger)
Construct a UserController
+ + +
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
+ + +
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)
+ +
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
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..c9a644e911 --- /dev/null +++ b/_instance_user_rights_8cs.html @@ -0,0 +1,124 @@ + + + + + + +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..1e820a43f9 --- /dev/null +++ b/_instance_user_rights_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum InstanceUserRights : ulong
10  {
14  None = 0,
18  ReadUsers = 1,
22  WriteUsers = 2,
26  CreateUsers = 4
27  }
28 }
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..346eb2b9d7 --- /dev/null +++ b/_insufficient_permissions_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_insufficient_permissions_exception_8cs_source.html b/_insufficient_permissions_exception_8cs_source.html new file mode 100644 index 0000000000..4876ca8371 --- /dev/null +++ b/_insufficient_permissions_exception_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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..fc0a0306a3 --- /dev/null +++ b/_integration_test_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Tests
 
+
+ + + + diff --git a/_integration_test_8cs_source.html b/_integration_test_8cs_source.html new file mode 100644 index 0000000000..b0106c2c50 --- /dev/null +++ b/_integration_test_8cs_source.html @@ -0,0 +1,139 @@ + + + + + + +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 }
DateTimeOffset ExpiresAt
When the Token expires
Definition: Token.cs:18
+
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
+ +
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
+ +
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
+ + +
+ + + + diff --git a/_irc_connection_string_builder_8cs.html b/_irc_connection_string_builder_8cs.html new file mode 100644 index 0000000000..19fb952824 --- /dev/null +++ b/_irc_connection_string_builder_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d47fd5c8b5 --- /dev/null +++ b/_irc_connection_string_builder_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
6 namespace Tgstation.Server.Api.Models
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  }
91 
92  if (splits.Length < 6)
93  return;
94 
95  var rest = new List<string>(splits);
96  rest.RemoveRange(0, 5);
97  Password = String.Join(";", rest);
98  }
99 
101  public override string ToString()
102  {
103  var sb = new StringBuilder();
104  sb.Append(Address);
105  sb.Append(';');
106  sb.Append(Port);
107  sb.Append(';');
108  sb.Append(Nickname);
109  sb.Append(';');
110  if(UseSsl.HasValue)
111  sb.Append(Convert.ToInt32(UseSsl.Value));
112  if (PasswordType.HasValue)
113  {
114  sb.Append(';');
115  sb.Append((int)PasswordType);
116  sb.Append(';');
117  sb.Append(Password);
118  }
119  return sb.ToString();
120  }
121  }
122 }
+ + + +
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 ...
+ +
+ + + + diff --git a/_irc_password_type_8cs.html b/_irc_password_type_8cs.html new file mode 100644 index 0000000000..8ec1116c31 --- /dev/null +++ b/_irc_password_type_8cs.html @@ -0,0 +1,123 @@ + + + + + + +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..39a7b51a98 --- /dev/null +++ b/_irc_password_type_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
2 {
6  public enum IrcPasswordType
7  {
11  Server,
15  Sasl,
19  NickServ
20  }
21 }
+ + +
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..3378029360 --- /dev/null +++ b/_irc_provider_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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
+
+ + + + + diff --git a/_irc_provider_8cs_source.html b/_irc_provider_8cs_source.html new file mode 100644 index 0000000000..531c2a0d20 --- /dev/null +++ b/_irc_provider_8cs_source.html @@ -0,0 +1,139 @@ + + + + + + +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 
13 namespace Tgstation.Server.Host.Components.Chat.Providers
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;
50  readonly ushort port;
54  readonly string nickname;
58  readonly string password;
63 
67  readonly Dictionary<ulong, string> channelIdMap;
68 
72  readonly Dictionary<ulong, string> queryChannelIdMap;
73 
78 
82  Task listenTask;
83 
88 
101  public IrcProvider(IApplication application, IAsyncDelayer asyncDelayer, ILogger<IrcProvider> logger, string address, ushort port, string nickname, string password, IrcPasswordType? passwordType, bool useSsl)
102  {
103  if (application == null)
104  throw new ArgumentNullException(nameof(application));
105  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
106  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
107 
108  this.address = address ?? throw new ArgumentNullException(nameof(address));
109  this.port = port;
110  this.nickname = nickname ?? throw new ArgumentNullException(nameof(nickname));
111 
112  if (passwordType.HasValue && password == null)
113  throw new ArgumentNullException(nameof(password));
114 
115  if (password != null && !passwordType.HasValue)
116  throw new ArgumentNullException(nameof(passwordType));
117 
118  this.password = password;
119  this.passwordType = passwordType;
120 
121  client = new IrcFeatures
122  {
123  SupportNonRfc = true,
124  CtcpUserInfo = "You are going to play. And I am going to watch. And everything will be just fine...",
125  AutoRejoin = true,
126  AutoRejoinOnKick = true,
127  AutoRelogin = true,
128  AutoRetry = true,
129  AutoRetryLimit = TimeoutSeconds,
130  AutoRetryDelay = TimeoutSeconds,
131  ActiveChannelSyncing = true,
132  AutoNickHandling = true,
133  CtcpVersion = application.VersionString,
134  UseSsl = useSsl
135  };
136  if (useSsl)
137  client.ValidateServerCertificate = true; //dunno if it defaults to that or what
138 
139  client.OnChannelMessage += Client_OnChannelMessage;
140  client.OnQueryMessage += Client_OnQueryMessage;
141 
142  channelIdMap = new Dictionary<ulong, string>();
143  queryChannelIdMap = new Dictionary<ulong, string>();
144  channelIdCounter = 1;
145  disconnecting = false;
146  }
147 
149  public override void Dispose()
150  {
151  if (Connected)
152  {
153  disconnecting = true;
154  client.Disconnect(); //just closes the socket
155  }
156  }
157 
163  void HandleMessage(IrcEventArgs e, bool isPrivate)
164  {
165  if (e.Data.Nick.ToUpperInvariant() == client.Nickname.ToUpperInvariant())
166  return;
167 
168  var username = e.Data.Nick;
169  var channelName = isPrivate ? username : e.Data.Channel;
170 
171  ulong MapAndGetChannelId(Dictionary<ulong, string> dicToCheck)
172  {
173  ulong? resultId = null;
174  if (!dicToCheck.Any(x =>
175  {
176  if (x.Value != channelName)
177  return false;
178  resultId = x.Key;
179  return true;
180  }))
181  {
182  resultId = channelIdCounter++;
183  dicToCheck.Add(resultId.Value, channelName);
184  if (dicToCheck == queryChannelIdMap)
185  channelIdMap.Add(resultId.Value, null);
186  }
187  return resultId.Value;
188  };
189 
190  ulong userId, channelId;
191  lock (this)
192  {
193  userId = MapAndGetChannelId(queryChannelIdMap);
194  channelId = isPrivate ? userId : MapAndGetChannelId(channelIdMap);
195  }
196 
197  var message = new Message
198  {
199  Content = e.Data.Message,
200  User = new User
201  {
202  Channel = new Channel
203  {
204  ConnectionName = address,
205  FriendlyName = isPrivate ? String.Format(CultureInfo.InvariantCulture, "PM: {0}", channelName) : channelName,
206  RealId = channelId,
207  IsPrivate = isPrivate
208  //isAdmin and Tag populated by manager
209  },
210  FriendlyName = username,
211  RealId = userId,
212  Mention = username
213  }
214  };
215 
216  EnqueueMessage(message);
217  }
218 
224  void Client_OnQueryMessage(object sender, IrcEventArgs e) => HandleMessage(e, true);
225 
231  void Client_OnChannelMessage(object sender, IrcEventArgs e) => HandleMessage(e, false);
232 
234  public override Task<bool> Connect(CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
235  {
236  disconnecting = false;
237  lock (this)
238  try
239  {
240  client.Connect(address, port);
241 
242  cancellationToken.ThrowIfCancellationRequested();
243 
244  if (passwordType == IrcPasswordType.Server)
245  client.Login(nickname, nickname, 0, nickname, password);
246  else
247  {
248  if (passwordType == IrcPasswordType.Sasl)
249  {
250  client.WriteLine("CAP REQ :sasl", Priority.Critical); //needs to be put in the buffer before anything else
251  cancellationToken.ThrowIfCancellationRequested();
252  }
253  client.Login(nickname, nickname, 0, nickname);
254  }
255 
256  if (passwordType == IrcPasswordType.NickServ)
257  {
258  cancellationToken.ThrowIfCancellationRequested();
259  client.SendMessage(SendType.Message, "NickServ", String.Format(CultureInfo.InvariantCulture, "IDENTIFY {0}", password));
260  }
261  else if (passwordType == IrcPasswordType.Sasl)
262  {
263  //wait for the sasl ack or timeout
264  var recievedAck = false;
265  var recievedPlus = false;
266  client.OnReadLine += (sender, e) =>
267  {
268  if (e.Line.Contains("ACK :sasl", StringComparison.Ordinal))
269  recievedAck = true;
270  else if (e.Line.Contains("AUTHENTICATE +", StringComparison.Ordinal))
271  recievedPlus = true;
272  };
273 
274  var startTime = DateTimeOffset.Now;
275  var endTime = DateTimeOffset.Now.AddSeconds(TimeoutSeconds);
276  cancellationToken.ThrowIfCancellationRequested();
277 
278  var listenTimeSpan = TimeSpan.FromMilliseconds(10);
279  for (; !recievedAck && DateTimeOffset.Now <= endTime; asyncDelayer.Delay(listenTimeSpan, cancellationToken).GetAwaiter().GetResult())
280  client.Listen(false);
281 
282  client.WriteLine("AUTHENTICATE PLAIN", Priority.Critical);
283  cancellationToken.ThrowIfCancellationRequested();
284 
285  for (; !recievedPlus && DateTimeOffset.Now <= endTime; asyncDelayer.Delay(listenTimeSpan, cancellationToken).GetAwaiter().GetResult())
286  client.Listen(false);
287 
288  //Stolen! https://github.com/znc/znc/blob/1e697580155d5a38f8b5a377f3b1d94aaa979539/modules/sasl.cpp#L196
289  var authString = String.Format(CultureInfo.InvariantCulture, "{0}{1}{0}{1}{2}", nickname, '\0', password);
290  var b64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(authString));
291  var authLine = String.Format(CultureInfo.InvariantCulture, "AUTHENTICATE {0}", b64);
292  var chars = authLine.ToCharArray();
293  client.WriteLine(authLine, Priority.Critical);
294 
295  cancellationToken.ThrowIfCancellationRequested();
296  client.WriteLine("CAP END", Priority.Critical);
297  }
298 
299  client.Listen(false);
300 
301  listenTask = Task.Factory.StartNew(() =>
302  {
303  while (!disconnecting && client.IsConnected && client.Nickname != nickname)
304  {
305  client.ListenOnce(true);
306  if (disconnecting || !client.IsConnected)
307  break;
308  client.Listen(false);
309  //ensure we have the correct nick
310  if (client.GetIrcUser(nickname) == null)
311  client.RfcNick(nickname);
312  }
313  client.Listen();
314  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
315  }
316  catch (OperationCanceledException)
317  {
318  throw;
319  }
320  catch (Exception e)
321  {
322  logger.LogWarning("Unable to connect to IRC: {0}", e);
323  return false;
324  }
325  return true;
326  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
327 
329  public override async Task Disconnect(CancellationToken cancellationToken)
330  {
331  if (!Connected)
332  return;
333  try
334  {
335  await Task.Factory.StartNew(() =>
336  {
337  try
338  {
339  client.RfcQuit("Mr. Stark, I don't feel so good...", Priority.Critical); //priocritical otherwise it wont go through
340  }
341  catch (Exception e)
342  {
343  logger.LogWarning("Error quitting IRC: {0}", e);
344  }
345  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
346  Dispose();
347  await listenTask.ConfigureAwait(false);
348  }
349  catch (OperationCanceledException)
350  {
351  throw;
352  }
353  catch (Exception e)
354  {
355  logger.LogWarning("Error disconnecting from IRC! Exception: {0}", e);
356  }
357  }
358 
360  public override Task<IReadOnlyList<Channel>> MapChannels(IEnumerable<ChatChannel> channels, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
361  {
362  if (channels.Any(x => x.IrcChannel == null))
363  throw new InvalidOperationException("ChatChannel missing IrcChannel!");
364  lock (this)
365  {
366  var hs = new HashSet<string>(); //for unique inserts
367  foreach (var I in channels)
368  hs.Add(I.IrcChannel);
369  var toPart = new List<string>();
370  foreach (var I in client.JoinedChannels)
371  if (!hs.Remove(I))
372  toPart.Add(I);
373 
374  foreach (var I in toPart)
375  client.RfcPart(I, "Pretty nice abscond!");
376  foreach (var I in hs)
377  client.RfcJoin(I);
378 
379  return (IReadOnlyList<Channel>)channels.Select(x =>
380  {
381  ulong? id = null;
382  if (!channelIdMap.Any(y =>
383  {
384  if (y.Value != x.IrcChannel)
385  return false;
386  id = y.Key;
387  return true;
388  }))
389  {
390  id = channelIdCounter++;
391  channelIdMap.Add(id.Value, x.IrcChannel);
392  }
393  return new Channel
394  {
395  RealId = id.Value,
396  IsAdmin = x.IsAdminChannel == true,
397  ConnectionName = address,
398  FriendlyName = channelIdMap[id.Value],
399  IsPrivate = false,
400  Tag = x.Tag
401  };
402  }).ToList();
403  }
404  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
405 
407  public override Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
408  {
409  var channelName = channelIdMap[channelId];
410  SendType sendType;
411  if (channelName == null)
412  {
413  channelName = queryChannelIdMap[channelId];
414  sendType = SendType.Notice;
415  }
416  else
417  sendType = SendType.Message;
418  try
419  {
420  client.SendMessage(sendType, channelName, message);
421  }
422  catch (Exception e)
423  {
424  logger.LogWarning("Unable to send to channel: {0}", e);
425  }
426  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
427  }
428 }
+
ulong channelIdCounter
Id counter for channelIdMap
Definition: IrcProvider.cs:77
+
readonly Dictionary< ulong, string > queryChannelIdMap
Map of Channel.RealIds to query users
Definition: IrcProvider.cs:72
+
readonly IrcFeatures client
The IrcFeatures client
Definition: IrcProvider.cs:41
+ +
readonly ushort port
Port of the server to connect to
Definition: IrcProvider.cs:50
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ + +
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
+
override async Task Disconnect(CancellationToken cancellationToken)
Gracefully disconnects the provider. Implies a call to IDisposable.Dispose
Definition: IrcProvider.cs:329
+
readonly Dictionary< ulong, string > channelIdMap
Map of Channel.RealIds to channel names
Definition: IrcProvider.cs:67
+
Represents a message recieved by a IProvider
Definition: Message.cs:6
+ + +
void HandleMessage(IrcEventArgs e, bool isPrivate)
Handle an IRC message
Definition: IrcProvider.cs:163
+ + +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IrcProvider
Definition: IrcProvider.cs:31
+ +
Task listenTask
The Task used for IrcConnection.Listen(bool)
Definition: IrcProvider.cs:82
+
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
readonly IrcPasswordType passwordType
The IrcPasswordType of password
Definition: IrcProvider.cs:62
+
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
+ + +
readonly string password
Password which will used for authentication
Definition: IrcProvider.cs:58
+
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:101
+ + +
+ + + + diff --git a/_job_controller_8cs.html b/_job_controller_8cs.html new file mode 100644 index 0000000000..4fccc4452c --- /dev/null +++ b/_job_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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..b0ab55245a --- /dev/null +++ b/_job_controller_8cs_source.html @@ -0,0 +1,133 @@ + + + + + + +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 
14 namespace Tgstation.Server.Host.Controllers
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
+ + + +
readonly IJobManager jobManager
The IJobManager for the JobController
+
ModelController<TModel> for Api.Models.Jobs
+ + + +
+ + + + diff --git a/_job_exception_8cs.html b/_job_exception_8cs.html new file mode 100644 index 0000000000..6ca628f226 --- /dev/null +++ b/_job_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_job_exception_8cs_source.html b/_job_exception_8cs_source.html new file mode 100644 index 0000000000..78eb15abf4 --- /dev/null +++ b/_job_exception_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Core
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..f7e9963f15 --- /dev/null +++ b/_job_handler_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_job_handler_8cs_source.html b/_job_handler_8cs_source.html new file mode 100644 index 0000000000..58713c43b3 --- /dev/null +++ b/_job_handler_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Core
6 {
10  sealed class JobHandler : IDisposable
11  {
15  readonly CancellationTokenSource cancellationTokenSource;
19  readonly Task task;
20 
25  public JobHandler(Func<CancellationToken, Task> job)
26  {
27  if (job == null)
28  throw new ArgumentNullException(nameof(job));
29  cancellationTokenSource = new CancellationTokenSource();
30  task = job(cancellationTokenSource.Token);
31  }
32 
34  public void Dispose() => cancellationTokenSource.Dispose();
35 
39  public int? Progress { get; set; }
40 
46  public async Task Wait(CancellationToken cancellationToken)
47  {
48  TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
49  using (cancellationToken.Register(() => tcs.SetCanceled()))
50  await Task.WhenAny(tcs.Task, task).ConfigureAwait(false);
51  cancellationToken.ThrowIfCancellationRequested();
52  }
53 
57  public void Cancel() => cancellationTokenSource.Cancel();
58  }
59 }
+ +
async Task Wait(CancellationToken cancellationToken)
Wait for task to complete
Definition: JobHandler.cs:46
+
JobHandler(Func< CancellationToken, Task > job)
Construct a JobHandler
Definition: JobHandler.cs:25
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for task
Definition: JobHandler.cs:15
+
readonly Task task
The Task being run
Definition: JobHandler.cs:19
+ + +
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..44953953be --- /dev/null +++ b/_job_manager_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_job_manager_8cs_source.html b/_job_manager_8cs_source.html new file mode 100644 index 0000000000..cfab0b9161 --- /dev/null +++ b/_job_manager_8cs_source.html @@ -0,0 +1,146 @@ + + + + + + +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 
10 namespace Tgstation.Server.Host.Core
11 {
14  {
19 
23  readonly ILogger<JobManager> logger;
24 
28  readonly Dictionary<long, JobHandler> jobs;
29 
35  public JobManager(IDatabaseContextFactory databaseContextFactory, ILogger<JobManager> logger)
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  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
202  }
203  }).ConfigureAwait(false);
204  logger.LogDebug("Job manager started!");
205  }
206 
208  public async Task StopAsync(CancellationToken cancellationToken)
209  {
210  var joinTasks = jobs.Select(x =>
211  {
212  x.Value.Cancel();
213  return x.Value.Wait(cancellationToken);
214  });
215  await Task.WhenAll(joinTasks).ConfigureAwait(false);
216  }
217 
219  public async Task<bool> CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
220  {
221  if (job == null)
222  throw new ArgumentNullException(nameof(job));
223  if (user == null)
224  throw new ArgumentNullException(nameof(user));
225  JobHandler handler;
226  try
227  {
228  handler = CheckGetJob(job);
229  }
230  catch (InvalidOperationException)
231  {
232  //this is fine
233  return false;
234  }
235  handler.Cancel(); //this will ensure the db update is only done once
236  await databaseContextFactory.UseContext(async databaseContext =>
237  {
238  job = new Job { Id = job.Id };
239  databaseContext.Jobs.Attach(job);
240  user = new User { Id = user.Id };
241  databaseContext.Users.Attach(user);
242  job.CancelledBy = user;
243  //let either startup or cancellation set job.cancelled
244  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
245  }).ConfigureAwait(false);
246  if (blocking)
247  await handler.Wait(cancellationToken).ConfigureAwait(false);
248  return true;
249  }
250 
252  public int? JobProgress(Job job)
253  {
254  if (job == null)
255  throw new ArgumentNullException(nameof(job));
256  lock (this)
257  {
258  if (!jobs.TryGetValue(job.Id, out var handler))
259  return null;
260  return handler.Progress;
261  }
262  }
263 
265  public async Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
266  {
267  if (job == null)
268  throw new ArgumentNullException(nameof(job));
269  if (canceller == null)
270  throw new ArgumentNullException(nameof(canceller));
271  JobHandler handler;
272  lock (this)
273  {
274  if (!jobs.TryGetValue(job.Id, out handler))
275  return;
276  }
277  Task cancelTask = null;
278  using (jobCancellationToken.Register(() => cancelTask = CancelJob(job, canceller, true, cancellationToken)))
279  await handler.Wait(cancellationToken).ConfigureAwait(false);
280 
281  if (cancelTask != null)
282  await cancelTask.ConfigureAwait(false);
283  }
284  }
285 }
+ +
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
+
User StartedBy
See Api.Models.Job.StartedBy
Definition: Job.cs:16
+ +
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
+
DateTimeOffset StoppedAt
When the Job stopped
Definition: Job.cs:37
+
async Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
Definition: JobManager.cs:219
+
async Task Wait(CancellationToken cancellationToken)
Wait for task to complete
Definition: JobHandler.cs:46
+
async Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
Wait for a given job to complete
Definition: JobManager.cs:265
+
DateTimeOffset StartedAt
When the Job was started
Definition: Job.cs:32
+
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
+ +
Instance Instance
The Models.Instance the job belongs to if any
Definition: Job.cs:27
+ +
async Task StopAsync(CancellationToken cancellationToken)
Definition: JobManager.cs:208
+
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.Job.StoppedAt time, unless it is cancelled or errors
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
+
int JobProgress(Job job)
Get the Api.Models.Job.Progress for a job
Definition: JobManager.cs:252
+
long Id
The ID of the User
Definition: User.cs:15
+ +
readonly IDatabaseContextFactory databaseContextFactory
The IServiceProvider for the JobManager
Definition: JobManager.cs:18
+ +
async Task RunJob(Job job, Func< Job, IDatabaseContext, CancellationToken, Task > operation, CancellationToken cancellationToken)
Runner for JobHandlers
Definition: JobManager.cs:71
+ +
bool Cancelled
If the Job was cancelled
Definition: Job.cs:43
+ + +
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..04c78a0923 --- /dev/null +++ b/_jobs_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/JobsClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JobsClient.cs File Reference
+
+ + + + + diff --git a/_jobs_client_8cs_source.html b/_jobs_client_8cs_source.html new file mode 100644 index 0000000000..c8b0dd7fd3 --- /dev/null +++ b/_jobs_client_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client.Components
9 {
11  sealed class JobsClient : IJobsClient
12  {
20  readonly Instance instance;
21 
27  public JobsClient(IApiClient apiClient, Instance instance)
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
32 
34  public Task Cancel(Job job, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.Jobs, job?.Id ?? throw new ArgumentNullException(nameof(job))), instance.Id, cancellationToken);
35 
37  public Task<IReadOnlyList<Job>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Job>>(Routes.List(Routes.Jobs), instance.Id, cancellationToken);
38 
40  public Task<IReadOnlyList<Job>> ListActive(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Job>>(Routes.Jobs, instance.Id, cancellationToken);
41 
43  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);
44  }
45 }
+ +
JobsClient(IApiClient apiClient, Instance instance)
Construct a JobsClient
Definition: JobsClient.cs:27
+ + +
Routes to a server actions
Definition: Routes.cs:9
+ + +
const string Jobs
The Models.Job controller
Definition: Routes.cs:79
+
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
+
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:20
+ +
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..6b1e90ca62 --- /dev/null +++ b/_json_file_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_json_file_8cs_source.html b/_json_file_8cs_source.html new file mode 100644 index 0000000000..8bc0d189ca --- /dev/null +++ b/_json_file_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Interop
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 }
+ + +
Representation of the initial json passed to DreamDaemon
Definition: JsonFile.cs:10
+ + + +
DreamDaemonSecurity
DreamDaemon&#39;s security level
+ +
+ + + + diff --git a/_json_sub_file_list_8cs.html b/_json_sub_file_list_8cs.html new file mode 100644 index 0000000000..42f1d112ac --- /dev/null +++ b/_json_sub_file_list_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..a9de74148a --- /dev/null +++ b/_json_sub_file_list_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Interop
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));
42  ChatChannelsJson = copy.ChatChannelsJson;
43  ChatCommandsJson = copy.ChatCommandsJson;
44  ServerCommandsJson = copy.ServerCommandsJson;
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..9337d59a3e --- /dev/null +++ b/_json_tracking_context_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JsonTrackingContext.cs File Reference
+
+ + + + + diff --git a/_json_tracking_context_8cs_source.html b/_json_tracking_context_8cs_source.html new file mode 100644 index 0000000000..5095d88dce --- /dev/null +++ b/_json_tracking_context_8cs_source.html @@ -0,0 +1,132 @@ + + + + + + +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 
13 namespace Tgstation.Server.Host.Components.Chat
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 
41  public JsonTrackingContext(IIOManager ioManager, ICustomCommandHandler customCommandHandler, ILogger<JsonTrackingContext> logger, Action onDispose, string commandsPath, string channelsPath)
42  {
43  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
44  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
45  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
46  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
47  this.commandsPath = commandsPath ?? throw new ArgumentNullException(nameof(commandsPath));
48  this.channelsPath = channelsPath ?? throw new ArgumentNullException(nameof(channelsPath));
49 
50  channelsSemaphore = new SemaphoreSlim(1);
51  active = false;
52 
53  logger.LogTrace("Created tracking context for {0} and {1}", commandsPath, channelsPath);
54  }
55 
57  public void Dispose()
58  {
59  logger.LogTrace("Disposing...");
60  onDispose();
61  }
62 
64  public async Task<IReadOnlyList<CustomCommand>> GetCustomCommands(CancellationToken cancellationToken)
65  {
66  try
67  {
68  if (Active && await ioManager.FileExists(commandsPath, cancellationToken).ConfigureAwait(false))
69  {
70  var resultBytes = await ioManager.ReadAllBytes(commandsPath, cancellationToken).ConfigureAwait(false);
71  var resultJson = Encoding.UTF8.GetString(resultBytes);
72  logger.LogTrace("Read commands JSON: {0}", resultJson);
73  var result = JsonConvert.DeserializeObject<List<CustomCommand>>(resultJson, new JsonSerializerSettings
74  {
75  ContractResolver = new DefaultContractResolver
76  {
77  NamingStrategy = new SnakeCaseNamingStrategy()
78  }
79  });
80  foreach (var I in result)
81  I.SetHandler(customCommandHandler);
82  return result;
83  }
84  }
85  catch (OperationCanceledException)
86  {
87  throw;
88  }
89  catch (Exception e)
90  {
91  logger.LogWarning("Error retrieving custom commands! Exception: {0}", e);
92  }
93  return new List<CustomCommand>();
94  }
95 
97  public async Task SetChannels(IEnumerable<Channel> channels, CancellationToken cancellationToken)
98  {
99  using (await SemaphoreSlimContext.Lock(channelsSemaphore, cancellationToken).ConfigureAwait(false))
100  {
101  var json = JsonConvert.SerializeObject(channels, new JsonSerializerSettings
102  {
103  ContractResolver = new CamelCasePropertyNamesContractResolver()
104  });
105  logger.LogTrace("Writing channels JSON: {0}", json);
106  await ioManager.WriteAllBytes(channelsPath, Encoding.UTF8.GetBytes(json), cancellationToken).ConfigureAwait(false);
107  }
108  }
109  }
110 }
+ + +
async Task SetChannels(IEnumerable< Channel > channels, CancellationToken cancellationToken)
Writes information about connected channels to the IJsonTrackingContext
+ + + + + + +
JsonTrackingContext(IIOManager ioManager, ICustomCommandHandler customCommandHandler, ILogger< JsonTrackingContext > logger, Action onDispose, string commandsPath, string channelsPath)
+ + + + +
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
+ +
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..f1434f1dbc --- /dev/null +++ b/_kek_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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..a32397dafd --- /dev/null +++ b/_kek_command_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Chat.Commands
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 }
+ + +
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..2218b84182 --- /dev/null +++ b/_launch_result_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_launch_result_8cs_source.html b/_launch_result_8cs_source.html new file mode 100644 index 0000000000..29e6166b8a --- /dev/null +++ b/_launch_result_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Watchdog
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
+ + + +
+ + + + diff --git a/_message_8cs.html b/_message_8cs.html new file mode 100644 index 0000000000..42cb368889 --- /dev/null +++ b/_message_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Chat.Providers
 
+
+ + + + diff --git a/_message_8cs_source.html b/_message_8cs_source.html new file mode 100644 index 0000000000..16f8827b27 --- /dev/null +++ b/_message_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components.Chat.Providers
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..e8d7fe8c24 --- /dev/null +++ b/_method_not_supported_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..47e5e5d7b8 --- /dev/null +++ b/_method_not_supported_exception_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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..16d5edc530 --- /dev/null +++ b/_model_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Controllers
 
+
+ + + + diff --git a/_model_controller_8cs_source.html b/_model_controller_8cs_source.html new file mode 100644 index 0000000000..d331cef745 --- /dev/null +++ b/_model_controller_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Controllers
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) { }
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>
+ + + +
An ApiController representing a TModel
+ + + + +
+ + + + diff --git a/_models_2_reattach_information_8cs.html b/_models_2_reattach_information_8cs.html new file mode 100644 index 0000000000..9223de5686 --- /dev/null +++ b/_models_2_reattach_information_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ReattachInformation.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReattachInformation.cs File Reference
+
+ + + + + diff --git a/_models_2_reattach_information_8cs_source.html b/_models_2_reattach_information_8cs_source.html new file mode 100644 index 0000000000..83505cbf0d --- /dev/null +++ b/_models_2_reattach_information_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
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..e503ecd0fc --- /dev/null +++ b/_models_2_watchdog_reattach_information_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/WatchdogReattachInformation.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogReattachInformation.cs File Reference
+
+ + + + + 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..90c03c66d1 --- /dev/null +++ b/_models_2_watchdog_reattach_information_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Models
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
+ +
Database representation of Components.Watchdog.ReattachInformation
+ + +
+ + + + diff --git a/_monitor_action_8cs.html b/_monitor_action_8cs.html new file mode 100644 index 0000000000..6ce9edf593 --- /dev/null +++ b/_monitor_action_8cs.html @@ -0,0 +1,128 @@ + + + + + + +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..dbc33c6c20 --- /dev/null +++ b/_monitor_action_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components.Watchdog
2 {
7  {
11  Continue,
15  Skip,
19  Restart,
23  Break,
27  Exit
28  }
29 }
+ +
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..1f7cd474f7 --- /dev/null +++ b/_monitor_activation_reason_8cs.html @@ -0,0 +1,130 @@ + + + + + + +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..582fd996bb --- /dev/null +++ b/_monitor_activation_reason_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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.
+ + + + diff --git a/_monitor_state_8cs.html b/_monitor_state_8cs.html new file mode 100644 index 0000000000..9a65ba8f95 --- /dev/null +++ b/_monitor_state_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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 Watchdog More...
 
+ + + +

+Namespaces

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..95a7ac2891 --- /dev/null +++ b/_monitor_state_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Watchdog
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 }
+
Handles communication with a DreamDaemon IProcess
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
The (absolute) state of the Watchdog
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..59c4d0de8d --- /dev/null +++ b/_my_sql_database_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MySqlDatabaseContext.cs File Reference
+
+ + + + + diff --git a/_my_sql_database_context_8cs_source.html b/_my_sql_database_context_8cs_source.html new file mode 100644 index 0000000000..23ddb4adf1 --- /dev/null +++ b/_my_sql_database_context_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Models
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  }
42 }
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
+ + +
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..ff99309916 --- /dev/null +++ b/_my_sql_database_context_model_snapshot_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..26b1d5d541 --- /dev/null +++ b/_my_sql_database_context_model_snapshot_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
7 
8 namespace Tgstation.Server.Host.Models.Migrations
9 {
12  {
13  protected override void BuildModel(ModelBuilder modelBuilder)
14  {
15 #pragma warning disable 612, 618
16  modelBuilder
17  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
18  .HasAnnotation("Relational:MaxIdentifierLength", 64);
19 
20  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
21  {
22  b.Property<long>("Id")
23  .ValueGeneratedOnAdd();
24 
25  b.Property<string>("ConnectionString")
26  .IsRequired();
27 
28  b.Property<bool?>("Enabled");
29 
30  b.Property<long>("InstanceId");
31 
32  b.Property<string>("Name")
33  .IsRequired();
34 
35  b.Property<int?>("Provider");
36 
37  b.HasKey("Id");
38 
39  b.HasIndex("InstanceId");
40 
41  b.HasIndex("Name")
42  .IsUnique();
43 
44  b.ToTable("ChatBots");
45  });
46 
47  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
48  {
49  b.Property<long>("Id")
50  .ValueGeneratedOnAdd();
51 
52  b.Property<long>("ChatSettingsId");
53 
54  b.Property<ulong?>("DiscordChannelId");
55 
56  b.Property<string>("IrcChannel");
57 
58  b.Property<bool?>("IsAdminChannel")
59  .IsRequired();
60 
61  b.Property<bool?>("IsUpdatesChannel")
62  .IsRequired();
63 
64  b.Property<bool?>("IsWatchdogChannel")
65  .IsRequired();
66 
67  b.Property<string>("Tag");
68 
69  b.HasKey("Id");
70 
71  b.HasIndex("ChatSettingsId", "DiscordChannelId")
72  .IsUnique();
73 
74  b.HasIndex("ChatSettingsId", "IrcChannel")
75  .IsUnique();
76 
77  b.ToTable("ChatChannels");
78  });
79 
80  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
81  {
82  b.Property<long>("Id")
83  .ValueGeneratedOnAdd();
84 
85  b.Property<string>("ByondVersion")
86  .IsRequired();
87 
88  b.Property<Guid?>("DirectoryName")
89  .IsRequired();
90 
91  b.Property<string>("DmeName")
92  .IsRequired();
93 
94  b.Property<long>("JobId");
95 
96  b.Property<int>("MinimumSecurityLevel");
97 
98  b.Property<string>("Output")
99  .IsRequired();
100 
101  b.Property<long>("RevisionInformationId");
102 
103  b.HasKey("Id");
104 
105  b.HasIndex("DirectoryName");
106 
107  b.HasIndex("JobId")
108  .IsUnique();
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.HasKey("Id");
199 
200  b.HasIndex("Path")
201  .IsUnique();
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  .IsRequired();
415 
416  b.Property<string>("PullRequestRevision")
417  .IsRequired();
418 
419  b.Property<string>("TitleAtMerge")
420  .IsRequired();
421 
422  b.Property<string>("Url")
423  .IsRequired();
424 
425  b.HasKey("Id");
426 
427  b.HasIndex("MergedById");
428 
429  b.HasIndex("PrimaryRevisionInformationId")
430  .IsUnique();
431 
432  b.ToTable("TestMerges");
433  });
434 
435  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
436  {
437  b.Property<long>("Id")
438  .ValueGeneratedOnAdd();
439 
440  b.Property<ulong>("AdministrationRights");
441 
442  b.Property<string>("CanonicalName")
443  .IsRequired();
444 
445  b.Property<DateTimeOffset?>("CreatedAt")
446  .IsRequired();
447 
448  b.Property<long?>("CreatedById");
449 
450  b.Property<bool?>("Enabled")
451  .IsRequired();
452 
453  b.Property<ulong>("InstanceManagerRights");
454 
455  b.Property<DateTimeOffset?>("LastPasswordUpdate");
456 
457  b.Property<string>("Name")
458  .IsRequired();
459 
460  b.Property<string>("PasswordHash");
461 
462  b.Property<string>("SystemIdentifier");
463 
464  b.HasKey("Id");
465 
466  b.HasIndex("CanonicalName")
467  .IsUnique();
468 
469  b.HasIndex("CreatedById");
470 
471  b.ToTable("Users");
472  });
473 
474  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
475  {
476  b.Property<long>("Id")
477  .ValueGeneratedOnAdd();
478 
479  b.Property<long?>("AlphaId");
480 
481  b.Property<bool>("AlphaIsActive");
482 
483  b.Property<long?>("BravoId");
484 
485  b.Property<long>("InstanceId");
486 
487  b.HasKey("Id");
488 
489  b.HasIndex("AlphaId");
490 
491  b.HasIndex("BravoId");
492 
493  b.HasIndex("InstanceId")
494  .IsUnique();
495 
496  b.ToTable("WatchdogReattachInformations");
497  });
498 
499  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
500  {
501  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
502  .WithMany("ChatSettings")
503  .HasForeignKey("InstanceId")
504  .OnDelete(DeleteBehavior.Cascade);
505  });
506 
507  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
508  {
509  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
510  .WithMany("Channels")
511  .HasForeignKey("ChatSettingsId")
512  .OnDelete(DeleteBehavior.Cascade);
513  });
514 
515  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
516  {
517  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
518  .WithOne()
519  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
520  .OnDelete(DeleteBehavior.Restrict);
521 
522  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
523  .WithMany("CompileJobs")
524  .HasForeignKey("RevisionInformationId")
525  .OnDelete(DeleteBehavior.Cascade);
526  });
527 
528  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
529  {
530  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
531  .WithOne("DreamDaemonSettings")
532  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
533  .OnDelete(DeleteBehavior.Cascade);
534  });
535 
536  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
537  {
538  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
539  .WithOne("DreamMakerSettings")
540  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
541  .OnDelete(DeleteBehavior.Cascade);
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  .OnDelete(DeleteBehavior.Cascade);
580  });
581 
582  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
583  {
584  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
585  .WithOne("RepositorySettings")
586  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
587  .OnDelete(DeleteBehavior.Cascade);
588  });
589 
590  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
591  {
592  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
593  .WithMany("ActiveTestMerges")
594  .HasForeignKey("RevisionInformationId")
595  .OnDelete(DeleteBehavior.Cascade);
596 
597  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
598  .WithMany("RevisonInformations")
599  .HasForeignKey("TestMergeId")
600  .OnDelete(DeleteBehavior.Cascade);
601  });
602 
603  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
604  {
605  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
606  .WithMany("RevisionInformations")
607  .HasForeignKey("InstanceId")
608  .OnDelete(DeleteBehavior.Cascade);
609  });
610 
611  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
612  {
613  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
614  .WithMany("TestMerges")
615  .HasForeignKey("MergedById")
616  .OnDelete(DeleteBehavior.Restrict);
617 
618  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
619  .WithOne("PrimaryTestMerge")
620  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
621  .OnDelete(DeleteBehavior.Restrict);
622  });
623 
624  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
625  {
626  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
627  .WithMany("CreatedUsers")
628  .HasForeignKey("CreatedById");
629  });
630 
631  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
632  {
633  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
634  .WithMany()
635  .HasForeignKey("AlphaId");
636 
637  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
638  .WithMany()
639  .HasForeignKey("BravoId");
640 
641  b.HasOne("Tgstation.Server.Host.Models.Instance")
642  .WithOne("WatchdogReattachInformation")
643  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
644  .OnDelete(DeleteBehavior.Cascade);
645  });
646 #pragma warning restore 612, 618
647  }
648  }
649 }
+ + + + + + + + +
DatabaseContext<TParentContext> for MySQL
+ +
+ + + + 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..b91b9ad81a --- /dev/null +++ b/_my_sql_design_time_db_context_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..11654e5315 --- /dev/null +++ b/_my_sql_design_time_db_context_factory_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models.Migrations
8 {
10  sealed class MySqlDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MySqlDatabaseContext>
11  {
13  public MySqlDatabaseContext CreateDbContext(string[] args) => new MySqlDatabaseContext(new DbContextOptions<MySqlDatabaseContext>(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher<User>())), new LoggerFactory().CreateLogger<MySqlDatabaseContext>());
14  }
15 }
+ +
Contains helpers for creating design time Models.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..f684b1e378 --- /dev/null +++ b/_native_methods_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host
 
+
+ + + + diff --git a/_native_methods_8cs_source.html b/_native_methods_8cs_source.html new file mode 100644 index 0000000000..e94b854b77 --- /dev/null +++ b/_native_methods_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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  static class NativeMethods
11  {
15  [Flags]
16  public enum CreateSymbolicLinkFlags : int
17  {
18  None = 0,
19  Directory = 1,
20  AllowUnprivilegedCreate = 2
21  }
22 
26  [DllImport("user32.dll")]
27  public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
28 
32  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
33  public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
34 
38  [DllImport("user32.dll")]
39  public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
40 
44  public delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
45 
49  [DllImport("user32.dll")]
50  public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);
51 
55  [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
56  public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
57 
61  [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
62  public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
63 
67  [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
68  public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, CreateSymbolicLinkFlags dwFlags);
69  }
70 }
+ +
CreateSymbolicLinkFlags
See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinka#param...
+
Native methods used by the code
+ +
+ + + + diff --git a/_platform_identifier_8cs.html b/_platform_identifier_8cs.html new file mode 100644 index 0000000000..e359b59492 --- /dev/null +++ b/_platform_identifier_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/PlatformIdentifier.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PlatformIdentifier.cs File Reference
+
+ + + + + diff --git a/_platform_identifier_8cs_source.html b/_platform_identifier_8cs_source.html new file mode 100644 index 0000000000..0c98d3f02a --- /dev/null +++ b/_platform_identifier_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Core
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..b0dac8f8ed --- /dev/null +++ b/_posix_byond_installer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/PosixByondInstaller.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PosixByondInstaller.cs File Reference
+
+ + + + + diff --git a/_posix_byond_installer_8cs_source.html b/_posix_byond_installer_8cs_source.html new file mode 100644 index 0000000000..680642f3b5 --- /dev/null +++ b/_posix_byond_installer_8cs_source.html @@ -0,0 +1,125 @@ + + + + + + +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.Net;
5 using System.Text;
6 using System.Threading;
7 using System.Threading.Tasks;
9 using Tgstation.Server.Host.IO;
10 
11 namespace Tgstation.Server.Host.Components.Byond
12 {
17  {
21  const string ByondRevisionsURL = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond_linux.zip";
25  const string ByondCachePath = "~/.byond/cache";
26 
27  const string DreamDaemonExecutableName = "DreamDaemon";
28  const string DreamMakerExecutableName = "DreamMaker";
29  const string ShellScriptExtension = ".sh";
30 
32  public string DreamDaemonName => DreamDaemonExecutableName + ShellScriptExtension;
33 
35  public string DreamMakerName => DreamMakerExecutableName + ShellScriptExtension;
36 
41 
46 
50  readonly ILogger<PosixByondInstaller> logger;
51 
58  public PosixByondInstaller(IIOManager ioManager, IPostWriteHandler postWriteHandler, ILogger<PosixByondInstaller> logger)
59  {
60  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
61  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
62  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
63  }
64 
66  public async Task CleanCache(CancellationToken cancellationToken)
67  {
68  try
69  {
70  await ioManager.DeleteDirectory(ByondCachePath, cancellationToken).ConfigureAwait(false);
71  }
72  catch (OperationCanceledException)
73  {
74  throw;
75  }
76  catch (Exception e)
77  {
78  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
79  }
80  }
81 
83  public async Task<byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
84  {
85  if (version == null)
86  throw new ArgumentNullException(nameof(version));
87 
88  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURL, version.Major, version.Minor);
89 
90  return await ioManager.DownloadFile(new Uri(url), cancellationToken).ConfigureAwait(false);
91  }
92 
94  public Task InstallByond(string path, Version version, CancellationToken cancellationToken)
95  {
96  if (path == null)
97  throw new ArgumentNullException(nameof(path));
98  if (version == null)
99  throw new ArgumentNullException(nameof(version));
100 
101  //write the scripts for running the ting
102  //need to add $ORIGIN to LD_LIBRARY_PATH
103  const string StandardScript = "#!/bin/sh\nexport LD_LIBRARY_PATH=\"\\$ORIGIN:$LD_LIBRARY_PATH\"\nBASEDIR=$(dirname \"$0\")\nexec \"$BASEDIR/{0}\" \"$@\"\n";
104 
105  var dreamDaemonScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamDaemonExecutableName);
106  var dreamMakerScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamMakerExecutableName);
107 
108  async Task WriteAndMakeExecutable(string fullPath, string script)
109  {
110  await ioManager.WriteAllBytes(fullPath, Encoding.ASCII.GetBytes(script), cancellationToken).ConfigureAwait(false);
111  postWriteHandler.HandleWrite(fullPath);
112  }
113 
114  var basePath = ioManager.ConcatPath(path, ByondManager.BinPath);
115 
116  var task = Task.WhenAll(WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamDaemonName), dreamDaemonScript), WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamMakerName), dreamMakerScript));
117 
118  postWriteHandler.HandleWrite(ioManager.ConcatPath(basePath, DreamDaemonExecutableName));
119  postWriteHandler.HandleWrite(ioManager.ConcatPath(basePath, DreamMakerExecutableName));
120 
121  return task;
122  }
123  }
124 }
+
PosixByondInstaller(IIOManager ioManager, IPostWriteHandler postWriteHandler, ILogger< PosixByondInstaller > logger)
Construct a WindowsByondInstaller
+
+ + +
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
+ + + +
+ + + + diff --git a/_posix_network_prompt_reaper_8cs.html b/_posix_network_prompt_reaper_8cs.html new file mode 100644 index 0000000000..06fb567cfb --- /dev/null +++ b/_posix_network_prompt_reaper_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..598abf63a0 --- /dev/null +++ b/_posix_network_prompt_reaper_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Watchdog
4 {
5  //POSIX BYOND doesn't prompt you when you change the port
8  {
10  public void RegisterProcess(IProcess process) { }
11  }
12 }
+
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(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it
+ + +
+ + + + diff --git a/_posix_post_write_handler_8cs.html b/_posix_post_write_handler_8cs.html new file mode 100644 index 0000000000..8a498a286c --- /dev/null +++ b/_posix_post_write_handler_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..8e47bc04ee --- /dev/null +++ b/_posix_post_write_handler_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.IO
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
+
+ + + +
+ + + + diff --git a/_posix_symlink_factory_8cs.html b/_posix_symlink_factory_8cs.html new file mode 100644 index 0000000000..08e19acac6 --- /dev/null +++ b/_posix_symlink_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..ca441608d3 --- /dev/null +++ b/_posix_symlink_factory_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.IO
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..aa929c74d7 --- /dev/null +++ b/_posix_system_identity_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/PosixSystemIdentityFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PosixSystemIdentityFactory.cs File Reference
+
+ + + + + diff --git a/_posix_system_identity_factory_8cs_source.html b/_posix_system_identity_factory_8cs_source.html new file mode 100644 index 0000000000..61942b11ad --- /dev/null +++ b/_posix_system_identity_factory_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Security
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 }
+ + + + + + + + +
+ + + + diff --git a/_process_8cs.html b/_process_8cs.html new file mode 100644 index 0000000000..63044a1317 --- /dev/null +++ b/_process_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_process_8cs_source.html b/_process_8cs_source.html new file mode 100644 index 0000000000..cf6ada84c2 --- /dev/null +++ b/_process_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Core
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 
31  public Process(System.Diagnostics.Process handle, Task<int> lifetime, StringBuilder outputStringBuilder, StringBuilder errorStringBuilder, StringBuilder combinedStringBuilder, ILogger<Process> logger, bool preExisting)
32  {
33  this.handle = handle ?? throw new ArgumentNullException(nameof(handle));
34  Lifetime = lifetime ?? throw new ArgumentNullException(nameof(lifetime));
35 
36  this.outputStringBuilder = outputStringBuilder;
37  this.errorStringBuilder = errorStringBuilder;
38  this.combinedStringBuilder = combinedStringBuilder;
39 
40  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
41 
42  Id = handle.Id;
43 
44  if (preExisting)
45  {
46  Startup = Task.CompletedTask;
47  return;
48  }
49 
50  Startup = Task.Factory.StartNew(() =>
51  {
52  try
53  {
54  handle.WaitForInputIdle();
55  }
56  catch (InvalidOperationException) { }
57  }, default, TaskCreationOptions.LongRunning, TaskScheduler.Current);
58 
59  logger.LogTrace("Created process ID: {0}", Id);
60  }
61 
63  public void Dispose() => handle.Dispose();
64 
66  public string GetCombinedOutput()
67  {
68  if (combinedStringBuilder == null)
69  throw new InvalidOperationException("Output/Error reading was not enabled!");
70  return combinedStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
71  }
72 
74  public string GetErrorOutput()
75  {
76  if (errorStringBuilder == null)
77  throw new InvalidOperationException("Error reading was not enabled!");
78  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
79  }
80 
82  public string GetStandardOutput()
83  {
84  if (outputStringBuilder == null)
85  throw new InvalidOperationException("Output reading was not enabled!");
86  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
87  }
88 
90  public void Terminate()
91  {
92  if (handle.HasExited)
93  return;
94  try
95  {
96  logger.LogTrace("Terminating process...");
97  handle.Kill();
98  handle.WaitForExit();
99  }
100  catch (Exception e)
101  {
102  logger.LogDebug("Process termination exception: {0}", e);
103  }
104  }
105 
106  public void SetHighPriority()
107  {
108  try
109  {
110  handle.PriorityClass = System.Diagnostics.ProcessPriorityClass.AboveNormal;
111  logger.LogTrace("Set to above normal priority", handle.Id);
112  }
113  catch (Exception e)
114  {
115  logger.LogWarning("Unable to raise process priority! Exception: {0}", e);
116  }
117  }
118  }
119 }
+
readonly StringBuilder errorStringBuilder
Definition: Process.cs:23
+ +
string GetErrorOutput()
Get the stderr output of the IProcess
Definition: Process.cs:74
+ + +
Process(System.Diagnostics.Process handle, Task< int > lifetime, StringBuilder outputStringBuilder, StringBuilder errorStringBuilder, StringBuilder combinedStringBuilder, ILogger< Process > logger, bool preExisting)
Definition: Process.cs:31
+
readonly StringBuilder combinedStringBuilder
Definition: Process.cs:24
+
string GetStandardOutput()
Get the stdout output of the IProcess
Definition: Process.cs:82
+
string GetCombinedOutput()
Get the stderr and stdout output of the IProcess
Definition: Process.cs:66
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
void SetHighPriority()
Set&#39;s the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal
Definition: Process.cs:106
+
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:90
+ +
+ + + + diff --git a/_process_executor_8cs.html b/_process_executor_8cs.html new file mode 100644 index 0000000000..dce1b3bfd2 --- /dev/null +++ b/_process_executor_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_process_executor_8cs_source.html b/_process_executor_8cs_source.html new file mode 100644 index 0000000000..48cc528ee0 --- /dev/null +++ b/_process_executor_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Core
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  tcs.SetResult(exitCode);
42  };
43  return tcs.Task;
44  }
45 
51  public ProcessExecutor(ILogger<ProcessExecutor> logger, ILoggerFactory loggerFactory)
52  {
53  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
54  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
55  }
56 
58  public IProcess GetProcess(int id)
59  {
60  logger.LogDebug("Attaching to process {0}...", id);
61  System.Diagnostics.Process handle;
62  try
63  {
64  handle = System.Diagnostics.Process.GetProcessById(id);
65  }
66  catch(Exception e)
67  {
68  logger.LogDebug("Unable to get process {0}! Exception: {1}", id, e);
69  return null;
70  }
71  try
72  {
73  return new Process(handle, AttachExitHandler(handle), null, null, null, loggerFactory.CreateLogger<Process>(), true);
74  }
75  catch
76  {
77  handle.Dispose();
78  throw;
79  }
80  }
81 
83  public IProcess LaunchProcess(string fileName, string workingDirectory, string arguments, bool readOutput, bool readError, bool noShellExecute)
84  {
85  logger.LogDebug("Launching process in {0}: {1} {2}", workingDirectory, fileName, arguments);
86  var handle = new System.Diagnostics.Process();
87  try
88  {
89  handle.StartInfo.FileName = fileName;
90  handle.StartInfo.Arguments = arguments;
91  handle.StartInfo.WorkingDirectory = workingDirectory;
92 
93  handle.StartInfo.UseShellExecute = !(noShellExecute || readOutput || readError);
94 
95  StringBuilder outputStringBuilder = null, errorStringBuilder = null, combinedStringBuilder = null;
96  if (readOutput || readError)
97  {
98  combinedStringBuilder = new StringBuilder();
99  if (readOutput)
100  {
101  outputStringBuilder = new StringBuilder();
102  handle.StartInfo.RedirectStandardOutput = true;
103  handle.OutputDataReceived += (sender, e) =>
104  {
105  combinedStringBuilder.Append(Environment.NewLine);
106  combinedStringBuilder.Append(e.Data);
107  outputStringBuilder.Append(Environment.NewLine);
108  outputStringBuilder.Append(e.Data);
109  };
110  }
111  if (readError)
112  {
113  errorStringBuilder = new StringBuilder();
114  handle.StartInfo.RedirectStandardError = true;
115  handle.ErrorDataReceived += (sender, e) =>
116  {
117  combinedStringBuilder.Append(Environment.NewLine);
118  combinedStringBuilder.Append(e.Data);
119  errorStringBuilder.Append(Environment.NewLine);
120  errorStringBuilder.Append(e.Data);
121  };
122  }
123  }
124 
125  var lifetimeTask = AttachExitHandler(handle);
126 
127  handle.Start();
128  try
129  {
130  if (readOutput)
131  handle.BeginOutputReadLine();
132  }
133  catch (InvalidOperationException) { }
134  try
135  {
136  if (readError)
137  handle.BeginErrorReadLine();
138  }
139  catch (InvalidOperationException) { }
140 
141  return new Process(handle, lifetimeTask, outputStringBuilder, errorStringBuilder, combinedStringBuilder, loggerFactory.CreateLogger<Process>(), false);
142  }
143  catch
144  {
145  handle.Dispose();
146  throw;
147  }
148  }
149  }
150 }
+
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/_program_8cs.html b/_program_8cs.html new file mode 100644 index 0000000000..5fbd0cbf3b --- /dev/null +++ b/_program_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host
 
+
+ + + + diff --git a/_program_8cs_source.html b/_program_8cs_source.html new file mode 100644 index 0000000000..4a46d806d5 --- /dev/null +++ b/_program_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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  internal static IServerFactory serverFactory = new ServerFactory();
19 
25  public static async Task<int> Main(string[] args)
26  {
27  var listArgs = new List<string>(args);
28  //first arg is 100% always the update path, starting it otherwise is solely for debugging purposes
29  string updatePath;
30  if (listArgs.Count > 0)
31  {
32  updatePath = listArgs[0];
33  listArgs.RemoveAt(0);
34  if (listArgs.Remove("--attach-debugger"))
35  Debugger.Launch();
36  }
37  else
38  updatePath = null;
39  try
40  {
41  var server = serverFactory.CreateServer(listArgs.ToArray(), updatePath);
42  try
43  {
44  using (var cts = new CancellationTokenSource())
45  {
46  void AppDomainHandler(object a, EventArgs b) => cts.Cancel();
47  AppDomain.CurrentDomain.ProcessExit += AppDomainHandler;
48  try
49  {
50  Console.CancelKeyPress += (a, b) =>
51  {
52  b.Cancel = true;
53  cts.Cancel();
54  };
55  await server.RunAsync(cts.Token).ConfigureAwait(false);
56  }
57  finally
58  {
59  AppDomain.CurrentDomain.ProcessExit -= AppDomainHandler;
60  }
61  }
62  }
63  catch (OperationCanceledException) { }
64  return server.RestartRequested ? 1 : 0;
65  }
66  catch (Exception e)
67  {
68  if (updatePath != null)
69  {
70  File.WriteAllText(updatePath, e.ToString());
71  return 2;
72  }
73  throw;
74  }
75  }
76  }
77 }
+ + + +
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:25
+ +
+ + + + diff --git a/_provider_8cs.html b/_provider_8cs.html new file mode 100644 index 0000000000..493751130f --- /dev/null +++ b/_provider_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..0617a05a07 --- /dev/null +++ b/_provider_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Chat.Providers
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
+
For interacting with a chat service
Definition: IProvider.cs:11
+ +
async Task< Message > NextMessage(CancellationToken cancellationToken)
Get a Task<TResult> resulting in the next Message the IProvider recieves or on a disconnect ...
Definition: Provider.cs:62
+
TaskCompletionSource< object > nextMessage
TaskCompletionSource<TResult> that completes while messageQueue isn&#39;t empty
Definition: Provider.cs:19
+ + +
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
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..58edaec3f9 --- /dev/null +++ b/_provider_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ProviderFactory.cs File Reference
+
+ + + + + diff --git a/_provider_factory_8cs_source.html b/_provider_factory_8cs_source.html new file mode 100644 index 0000000000..18438276ca --- /dev/null +++ b/_provider_factory_8cs_source.html @@ -0,0 +1,129 @@ + + + + + + +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.Collections.Generic;
4 using System.Globalization;
8 
9 namespace Tgstation.Server.Host.Components.Chat
10 {
13  {
18 
23 
27  readonly ILoggerFactory loggerFactory;
28 
35  public ProviderFactory(IApplication application, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
36  {
37  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
38  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
39  this.application = application ?? throw new ArgumentNullException(nameof(application));
40  }
41 
43  public IProvider CreateProvider(Api.Models.Internal.ChatBot settings)
44  {
45  if (settings == null)
46  throw new ArgumentNullException(nameof(settings));
47  var builder = settings.ConnectionStringBuilder;
48  if (builder == null || !builder.Valid)
49  throw new InvalidOperationException("Invalid ChatConnectionStringBuilder!");
50  switch (settings.Provider)
51  {
52  case ChatProvider.Irc:
53  var ircBuilder = (IrcConnectionStringBuilder)builder;
54  return new IrcProvider(application, asyncDelayer, loggerFactory.CreateLogger<IrcProvider>(), ircBuilder.Address, ircBuilder.Port.Value, ircBuilder.Nickname, ircBuilder.Password, ircBuilder.PasswordType, ircBuilder.UseSsl.Value);
55  case ChatProvider.Discord:
56  var discordBuilder = (DiscordConnectionStringBuilder)builder;
57  return new DiscordProvider(loggerFactory.CreateLogger<DiscordProvider>(), discordBuilder.BotToken);
58  default:
59  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid ChatProvider: {0}", settings.Provider));
60  }
61  }
62  }
63 }
+ +
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
+
For interacting with a chat service
Definition: IProvider.cs:11
+ + + + + +
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..01d13d0a9e --- /dev/null +++ b/_pull_requests_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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
+
+ + + + + diff --git a/_pull_requests_command_8cs_source.html b/_pull_requests_command_8cs_source.html new file mode 100644 index 0000000000..8b9817a2f5 --- /dev/null +++ b/_pull_requests_command_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +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 
12 namespace Tgstation.Server.Host.Components.Chat.Commands
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 
55  public PullRequestsCommand(IWatchdog watchdog, IRepositoryManager repositoryManager, IDatabaseContextFactory databaseContextFactory, Models.Instance instance)
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  public async Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken)
65  {
66  IEnumerable<Models.TestMerge> results = null;
67  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
68  {
69  string head;
70  using (var repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
71  {
72  if (repo == null)
73  return "Repository unavailable!";
74  head = repo.Head;
75  }
76  await databaseContextFactory.UseContext(async db => results = await db.RevisionInformations.Where(x => x.Instance.Id == instance.Id && x.CommitSha == head)
77  .SelectMany(x => x.ActiveTestMerges)
78  .Select(x => x.TestMerge)
79  .Select(x => new Models.TestMerge
80  {
81  Number = x.Number,
82  PullRequestRevision = x.PullRequestRevision
83  }).ToListAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
84  }
85  else
86  {
87  if (!watchdog.Running)
88  return "Server offline!";
89  results = watchdog.ActiveCompileJob?.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).ToList() ?? new List<Models.TestMerge>();
90  }
91 
92  if (!results.Any())
93  return "None!";
94 
95  return String.Join(", ", results.Select(x => String.Format(CultureInfo.InvariantCulture, "#{0} at {1}", x.Number, x.PullRequestRevision.Substring(0, 7))));
96  }
97  }
98 }
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
+ + +
readonly Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
Command for reading the active Api.Models.TestMerges
+
readonly IWatchdog watchdog
The IWatchdog for the PullRequestsCommand
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+ +
Factory for creating and loading IRepositorys
+ +
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..01cf882bd5 --- /dev/null +++ b/_r_e_a_d_m_e_8md.html @@ -0,0 +1,101 @@ + + + + + + +tgstation-server: README.md File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
README.md File Reference
+
+ + + + + diff --git a/_r_e_a_d_m_e_8md_source.html b/_r_e_a_d_m_e_8md_source.html new file mode 100644 index 0000000000..21d2584ba5 --- /dev/null +++ b/_r_e_a_d_m_e_8md_source.html @@ -0,0 +1,99 @@ + + + + + + +tgstation-server: README.md Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
README.md
+
+
+Go to the documentation of this file.
1 # tgstation-server v4:
2 
3 [![Build status](https://ci.appveyor.com/api/projects/status/7t1h7bvuha0p9j5f/branch/master?svg=true)](https://ci.appveyor.com/project/Cyberboss/tgstation-server-tools/branch/master) [![Build Status](https://travis-ci.org/tgstation/tgstation-server.svg?branch=master)](https://travis-ci.org/tgstation/tgstation-server) [![codecov](https://codecov.io/gh/tgstation/tgstation-server/branch/master/graph/badge.svg)](https://codecov.io/gh/tgstation/tgstation-server) [![Waffle.io - Columns and their card count](https://badge.waffle.io/tgstation/tgstation-server.png?columns=all)](https://waffle.io/tgstation/tgstation-server?utm_source=badge)
4 
5 [![GitHub license](https://img.shields.io/github/license/tgstation/tgstation-server.svg)](https://github.com/tgstation/tgstation-server/blob/master/LICENSE) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/tgstation/tgstation-server.svg)](http://isitmaintained.com/project/tgstation/tgstation-server "Average time to resolve an issue") [![NuGet version](https://img.shields.io/nuget/v/Tgstation.Server.Api.svg)](https://www.nuget.org/packages/Tgstation.Server.Api) [![NuGet version](https://img.shields.io/nuget/v/Tgstation.Server.Client.svg)](https://www.nuget.org/packages/Tgstation.Server.Client)
6 
7 [![forthebadge](http://forthebadge.com/images/badges/made-with-c-sharp.svg)](http://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
8 
9 [![forthebadge](http://forthebadge.com/images/badges/built-with-love.svg)](http://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](http://forthebadge.com)
10 
11 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.
12 
13 ### Legacy Servers
14 
15 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
16 
17 ## Setup
18 
19 ### Pre-Requisites
20 
21 - [.NET Core Runtime (>= v2.1)](https://www.microsoft.com/net/download) 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).
22 - A [MariaDB](https://downloads.mariadb.org/), MySQL, or [Microsoft SQL Server](https://www.microsoft.com/en-us/download/details.aspx?id=55994) database engine is required
23 
24 ### Installation
25 
26 1. [Download the latest V4 release .zip](https://github.com/tgstation/tgstation-server/releases/latest). 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.
27 2. 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.
28 
29 #### Windows
30 
31 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.
32 
33 #### Linux (Native)
34 
35 We recommend using Docker for Linux installations, see below. The content of this parent section may be skipped if you choose to do so.
36 
37 The following dependencies are required to run tgstation-server on Linux alongside the .NET Core runtime
38 
39 - gcc-multilib (on 64-bit systems for running BYOND)
40 
41 Note that tgstation-server has only ever been tested on Linux via it's [docker environment](https://github.com/tgstation/tgstation-server/blob/master/build/Dockerfile#L22). 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.
42 
43 #### Docker (Linux)
44 
45 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.
46 
47 To create a container run
48 ```sh
49 docker run \
50  -ti \ #start interactive for manual configuration
51  --restart=always \ #if you want maximum uptime
52  --network="host" \ #if your sql server is on the same machine
53  --name="tgs" \ #or whatever else you wanna call it
54  --cap-add=sys_nice \ #allows tgs to schedule DreamDaemon as a higher priority process
55  --init \ #reaps potential zombie processes
56  -p <tgs port>:80 \
57  -p 0.0.0.0:<public game port>:<public game port> \
58  -v /path/to/your/configfile/directory:/config_data \ #only if you want to use manual configuration
59  -v /path/to/store/instances:/tgs4_instances \
60  -v /path/to/your/log/folder:/tgs_logs \
61  tgstation/server #replace this with <your tag name> if you built the image locally
62 ```
63 with any additional options you desire (i.e. You'll have to expose more game ports in order to host more than one instance).
64 
65 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.
66 
67 If using manual configuration, before starting your container make sure the aforemention `appsettings.Production.json` is setup properly. See below
68 
69 ### Configuring
70 
71 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
72 
73 This wizard will, generally, run whenever the server is launched without detecting the config json. Follow the instructions below to perform this process manually.
74 
75 #### Manual Configuration
76 
77 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:
78 
79 - `General:MinimumPasswordLength`: Minimum password length requirement for database users
80 
81 - `General:GitHubAccessToken`: Specify a GitHub personal access token with no scopes here to highly mitigate the possiblity of 429 response codes from GitHub requests
82 
83 - `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
84 
85 - `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.
86 
87 - `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
88 
89 - `Database:DatabaseType`: Can be one of `SqlServer`, `MariaDB`, or `MySql`
90 
91 - `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](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/blob/2.1.1/src/EFCore.MySql/Storage/Internal/ServerVersion.cs) ignore at your own risk. A string in the form `<major>.<minor>.<patch>`
92 
93 - `Database:ConnectionString`: Connection string for your database. Click [here](https://www.developerfusion.com/tools/sql-connection-string/) for an SQL Server generator or see [here](https://www.connectionstrings.com/mysql/) for a MySQL guide ([You should probably use '127.0.0.1' instead of 'localhost'](https://stackoverflow.com/questions/19712307/mysql-localhost-127-0-0-1)).
94 
95 ### Database Configuration
96 
97 If using a MariaDB/MySQL server, our client library [recommends you set 'utf8mb4' as your default charset](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql#1-recommended-server-charset) disregard at your own risk.
98 
99 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
100 
101 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)
102 
103 ### Starting
104 
105 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.
106 
107 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.
108 
109 For the docker version run `docker start <your container name>`
110 
111 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.
112 
113 ### Stopping
114 
115 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.
116 
117 For the Windows service version stop the `tgstation-server-4` service
118 
119 For the console version press `Ctrl+C` or send a SIGQUIT to the ORIGINAL dotnet process
120 
121 For the docker version run `docker stop <your container name>`
122 
123 ## Integrating
124 
125 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.
126 
127 1. Copy the [DMAPI](https://github.com/tgstation/tgstation-server/tree/master/src/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
128 2. Modify your `.dme`(s) to include the `tgs.dm` and `tgs/includes.dm` files (ORDER OF APPEARANCE IS MANDATORY)
129 3. Follow the instructions in `tgs.dm` to integrate the API with your codebase.
130 
131 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
132 
133 ### Example
134 
135 Here is a bare minimum example project that implements the essential code changes for integrating the DMAPI
136 
137 Before `tgs.dm`:
138 ```dm
139 //Remember, every codebase is different, you probably have better methods for these defines than the ones given here
140 #define TGS_EXTERNAL_CONFIGURATION
141 #define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) var/global/##Name = ##Value
142 #define TGS_READ_GLOBAL(Name) global.##Name
143 #define TGS_WRITE_GLOBAL(Name, Value) global.##Name = ##Value
144 #define TGS_WORLD_ANNOUNCE(message) world << ##message
145 #define TGS_INFO_LOG(message) world.log << "TGS Info: [##message]"
146 #define TGS_ERROR_LOG(message) world.log << "TGS Error: [##message]"
147 #define TGS_NOTIFY_ADMINS(event) world.log << "TGS Admin Message: [##event]"
148 #define TGS_CLIENT_COUNT global.client_cout
149 #define TGS_PROTECT_DATUM(Path) // Leave blank if your codebase doesn't give administrators code reflection capabilities
150 ```
151 
152 Anywhere else:
153 ```dm
154 var/global/client_count = 0
155 
156 /world/New()
157  ..()
158  TgsNew()
159  TgsInitializationsComplete()
160 
161 /world/Reboot()
162  TgsReboot()
163  ..()
164 
165 /world/Topic()
166  TGS_TOPIC
167  ..()
168 
169 /client/New()
170  ..()
171  ++global.client_count
172 
173 /client/Del()
174  ..()
175  --global.client_count
176 
177 ```
178 
179 ## Remote Access
180 
181 tgstation-server is an [ASP.Net Core](https://docs.microsoft.com/en-us/aspnet/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](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel) for details.
182 
183 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.
184 
185 System administrators will most likely have their own configuration plans, but here are some basic guides for beginners.
186 
187 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.
188 
189 ### IIS (Reccommended for Windows)
190 
191 1. Acquire an HTTPS certificate. The easiet free way for Windows is [win-acme](https://github.com/PKISharp/win-acme) (requires you to set up the website first)
192 2. Install the [Web Platform Installer](https://www.microsoft.com/web/downloads/platform.aspx)
193 3. Open the web platform installer in the IIS Manager and install the Application Request Routing 3.0 module
194 4. 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.
195 5. Close and reopen the IIS Manager
196 5. Open the site and navigate to the `URL Rewrite` module
197 6. In the `Actions` Pane on the right click `Add Rule(s)...`
198 7. For the rule template, select `Reverse Proxy` under `Inbound and Outbound Rules` and click `OK`
199 8. You may get a prompt about enabling proxy functionality. Click `OK`
200 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`
201 
202 ### Caddy (Reccommended for Linux, or those unfamilar with configuring NGINX or Apache)
203 
204 1. Setup a basic website configuration. Instructions on how to do so are out of scope.
205 2. In your Caddyfile, under a server entry, add the following (replace 8080 with the port TGS is hosted on):
206 ```
207 proxy /tgs localhost:8080 {
208  transparent
209 }
210 ```
211 
212 See https://caddyserver.com/docs/proxy
213 
214 ### NGINX (Reccommended for Linux)
215 
216 1. Setup a basic website configuration. Instructions on how to do so are out of scope.
217 2. Acquire an HTTPS certificate, likely via Let's Encrypt, and configure NGINX to use it.
218 3. Setup a path under a server like the following (replace 8080 with the port TGS is hosted on):
219 ```
220 location /tgs {
221  proxy_pass http://127.0.0.1:8080;
222  break;
223 }
224 ```
225 
226 See https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
227 
228 ### Apache
229 
230 1. Ensure the `mod_proxy` extension is installed.
231 2. Setup a basic website configuration. Instructions on how to do so are out of scope.
232 3. Acquire an HTTPS certificate, likely via Let's Encrypt, and configure Apache to use it.
233 4. Under a VirtualHost entry, setup the following (replace 8080 with the port TGS is hosted on):
234 ```
235 ProxyPass / http://127.0.0.1:8080
236 ProxyPassReverse / http://127.0.0.1:8080
237 ```
238 
239 See https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html
240 
241 ## Usage
242 
243 tgstation-server v4 is controlled via a RESTful HTTP json API. Documentation on this API can be found [here](https://tgstation.github.io/tgstation-server/api.html). This section serves to document the concepts of the server.
244 
245 ### Users
246 
247 All actions apart from logging in must be taken by a user. TGS installs with one default user whose credentials can be found [here](https://github.com/tgstation/tgstation-server/blob/master/src/Tgstation.Server.Api/Models/User.cs). 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.
248 
249 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.
250 
251 ### Instances
252 
253 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.
254 
255 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.
256 
257 ##### Instance Users
258 
259 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).
260 
261 #### Repository
262 
263 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).
264 
265 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.
266 
267 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.
268 
269 #### Byond
270 
271 The `Byond` folder contains installations of [BYOND](https://secure.byond.com/) 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.
272 
273 #### Compiler
274 
275 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).
276 
277 #### Watchdog
278 
279 The watchdog is responsible for starting and keeping your server running. It functions by launching two servers which are hot-swapped on `/world/Reboot`s 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.
280 
281 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.
282 
283 #### Chat Bots
284 
285 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
286 
287 - Internet Relay Chat (IRC)
288 - Discord
289 
290 More can be added by providing a new implementation of the [IProvider](https://github.com/tgstation/tgstation-server/blob/master/src/Tgstation.Server.Host/Components/Chat/Providers/IProvider.cs) interface
291 
292 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.
293 
294 #### Static Files
295 
296 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.
297 
298 The `StaticFiles` folder contains 3 root folders which cannot be deleted and operate under special rules
299  - `CodeModifications`
300  - `EventScripts`
301  - `GameStaticFiles`
302 
303 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.
304 
305 This folder may be freely modified manually just beware this may cause in-progress deployments to error if done on Windows systems.
306 
307 #### CodeModifications
308 
309 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.
310 
311 If `<target dme>.dm` is present, that .dme will be used instead of the repository's `.dme`
312 
313 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 `#include`ing other `.dm` files!) allowing you to modify the a repository's code on a per instance basis
314 
315 #### EventScripts
316 
317 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](https://github.com/tgstation/tgstation-server/blob/master/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs#L28) (subject to expansion) list of event parameters can be found [here](https://github.com/tgstation/tgstation-server/blob/master/src/Tgstation.Server.Host/Components/EventType.cs)
318 
319 #### GameStaticFiles
320 
321 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 `.sav`s 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)
322 
323 ### Updating
324 
325 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`).
326 
327 ### Clients
328 
329 Here are tools for interacting with the TGS 4 web API
330 
331 - [Tgstation.Server.ControlPanel](https://github.com/tgstation/Tgstation.Server.ControlPanel): Official client. A cross platform GUI for using tgstation-server
332 - [Tgstation.Server.Client](https://www.nuget.org/packages/Tgstation.Server.Client): A nuget .NET Standard 2.0 TAP based library for communicating with tgstation-server
333 - [Tgstation.Server.Api](https://www.nuget.org/packages/Tgstation.Server.Api): A nuget .NET Standard 2.0 library containing API definitions for tgstation-server
334 - [Postman](https://www.getpostman.com/): This repository contains [TGS.postman_collection.json](https://github.com/tgstation/tgstation-server/blob/master/tools/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)
335 
336 Contact project maintainers to get your client added to this list
337 
338 ## Backup/Restore
339 
340 Note that tgstation-server is NOT a backup solution, the onus is on the server runners.
341 
342 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.
343 
344 The `BYOND` and `Game` folders should never be backed up due.
345 
346 The `Configuration` folder should and database be fully backed up
347 
348 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.
349 
350 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
351 
352 ## Troubleshooting
353 
354 Feel free to ask for help at the coderbus discord in #tooling-questions: https://discord.gg/Vh8TJp9. Cyberboss#8246 can answer most questions.
355 
356 ## Contributing
357 
358 * See [CONTRIBUTING.md](https://github.com/tgstation/tgstation-server/blob/master/.github/CONTRIBUTING.md)
359 
360 ## Licensing
361 
362 * The DMAPI for the project is licensed under the MIT license.
363 * The /tg/station 13 icon is licensed under [Creative Commons 3.0 BY-SA](http://creativecommons.org/licenses/by-sa/3.0/).
364 * The remainder of the project is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html)
365 
366 See the files in the `/src/DMAPI` tree for the MIT license
+ + + + diff --git a/_rate_limit_exception_8cs.html b/_rate_limit_exception_8cs.html new file mode 100644 index 0000000000..8919f8d83b --- /dev/null +++ b/_rate_limit_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_rate_limit_exception_8cs_source.html b/_rate_limit_exception_8cs_source.html new file mode 100644 index 0000000000..1c8236cb7b --- /dev/null +++ b/_rate_limit_exception_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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..fbdefb62f4 --- /dev/null +++ b/_reattach_info_handler_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/ReattachInfoHandler.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReattachInfoHandler.cs File Reference
+
+ + + + + diff --git a/_reattach_info_handler_8cs_source.html b/_reattach_info_handler_8cs_source.html new file mode 100644 index 0000000000..978325a785 --- /dev/null +++ b/_reattach_info_handler_8cs_source.html @@ -0,0 +1,138 @@ + + + + + + +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 
12 namespace Tgstation.Server.Host.Components
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
+
async Task< WatchdogReattachInformation > Load(CancellationToken cancellationToken)
Load a saved WatchdogReattachInformation
+
ReattachInformation Alpha
ReattachInformation for the Alpha session
+ +
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
+ + +
ReattachInformation Bravo
ReattachInformation for the Bravo session
+ +
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..463ec4d147 --- /dev/null +++ b/_reattach_information_base_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ReattachInformationBase.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReattachInformationBase.cs File Reference
+
+ + + + + diff --git a/_reattach_information_base_8cs_source.html b/_reattach_information_base_8cs_source.html new file mode 100644 index 0000000000..a3ab24010e --- /dev/null +++ b/_reattach_information_base_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models
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));
53  AccessIdentifier = copy.AccessIdentifier;
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..90034e5519 --- /dev/null +++ b/_reboot_state_8cs.html @@ -0,0 +1,123 @@ + + + + + + +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..210b910d69 --- /dev/null +++ b/_reboot_state_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components.Watchdog
2 {
6  public enum RebootState : int
7  {
11  Normal = 0,
15  Shutdown = 1,
19  Restart = 2
20  }
21 }
Run DreamDaemon&#39;s normal reboot process
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+ +
+ + + + diff --git a/_repository_client_8cs.html b/_repository_client_8cs.html new file mode 100644 index 0000000000..d6e426d02a --- /dev/null +++ b/_repository_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/RepositoryClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositoryClient.cs File Reference
+
+ + + + + diff --git a/_repository_client_8cs_source.html b/_repository_client_8cs_source.html new file mode 100644 index 0000000000..4747defb67 --- /dev/null +++ b/_repository_client_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + +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 
7 namespace Tgstation.Server.Client.Components
8 {
11  {
19  readonly Instance instance;
20 
26  public RepositoryClient(IApiClient apiClient, Instance instance)
27  {
28  this.apiClient = apiClient;
29  this.instance = instance;
30  }
31 
33  public Task<Repository> Clone(Repository repository, CancellationToken cancellationToken) => apiClient.Create<Repository, Repository>(Routes.Repository, repository, instance.Id, cancellationToken);
34 
36  public Task<Repository> Delete(CancellationToken cancellationToken) => apiClient.Delete<Repository>(Routes.Repository, instance.Id, cancellationToken);
37 
39  public Task<Repository> Read(CancellationToken cancellationToken) => apiClient.Read<Repository>(Routes.Repository, instance.Id, cancellationToken);
40 
42  public Task<Repository> Update(Repository repository, CancellationToken cancellationToken) => apiClient.Update<Repository, Repository>(Routes.Repository, repository ?? throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken);
43  }
44 }
+ + + +
readonly Instance instance
The Instance for the RepositoryClient
+ +
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
+
Metadata about a server instance
Definition: Instance.cs:9
+
readonly IApiClient apiClient
The IApiClient for the RepositoryClient
+ +
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..2afc6cb02e --- /dev/null +++ b/_repository_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Controllers
 
+
+ + + + diff --git a/_repository_controller_8cs_source.html b/_repository_controller_8cs_source.html new file mode 100644 index 0000000000..a273354399 --- /dev/null +++ b/_repository_controller_8cs_source.html @@ -0,0 +1,163 @@ + + + + + + +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 
23 namespace Tgstation.Server.Host.Controllers
24 {
28  [Route(Routes.Repository)]
29  public sealed class RepositoryController : ModelController<Repository>
30  {
35 
40 
45 
50 
61  public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger<RepositoryController> logger, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, true)
62  {
63  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
64  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
65  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
66  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
67  }
68 
69  async Task<bool> LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action<Models.RevisionInformation> revInfoSink, CancellationToken cancellationToken)
70  {
71  var repoSha = repository.Head;
72 
73  IQueryable<Models.RevisionInformation> ApplyQuery(IQueryable<Models.RevisionInformation> query) => query
74  .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id)
75  .Include(x => x.CompileJobs)
76  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy);
77 
78  var revisionInfo = await ApplyQuery(databaseContext.RevisionInformations).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
79 
80  if (revisionInfo == default)
81  revisionInfo = databaseContext.RevisionInformations.Local.Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id).FirstOrDefault();
82 
83  var needsDbUpdate = revisionInfo == default;
84  if (needsDbUpdate)
85  {
86  //needs insertion
87  revisionInfo = new Models.RevisionInformation
88  {
89  Instance = instance,
90  CommitSha = repoSha,
91  CompileJobs = new List<Models.CompileJob>(),
92  ActiveTestMerges = new List<RevInfoTestMerge>() //non null vals for api returns
93  };
94 
95  lock (databaseContext) //cleaner this way
96  databaseContext.RevisionInformations.Add(revisionInfo);
97  }
98  revisionInfo.OriginCommitSha = revisionInfo.OriginCommitSha ?? lastOriginCommitSha;
99  if (revisionInfo.OriginCommitSha == null)
100  {
101  revisionInfo.OriginCommitSha = repoSha;
102  Logger.LogWarning(Components.Repository.Repository.OriginTrackingErrorTemplate, repoSha);
103  }
104  revInfoSink?.Invoke(revisionInfo);
105  return needsDbUpdate;
106  }
107 
108  async Task<bool> PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
109  {
110  if (repository.IsGitHubRepository)
111  {
112  model.GitHubOwner = repository.GitHubOwner;
113  model.GitHubName = repository.GitHubRepoName;
114  }
115  model.Origin = repository.Origin;
116  model.Reference = repository.Reference;
117 
118  //rev info stuff
119  Models.RevisionInformation revisionInfo = null;
120  var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, null, x => revisionInfo = x, cancellationToken).ConfigureAwait(false);
121  model.RevisionInformation = revisionInfo.ToApi();
122  return needsDbUpdate;
123  }
124 
126  [TgsAuthorize(RepositoryRights.SetOrigin)]
127  public override async Task<IActionResult> Create([FromBody] Repository model, CancellationToken cancellationToken)
128  {
129  if (model == null)
130  throw new ArgumentNullException(nameof(model));
131 
132  if (model.Origin == null)
133  return BadRequest(new ErrorMessage { Message = "Missing repo origin!" });
134 
135  if (model.AccessUser == null ^ model.AccessToken == null)
136  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
137 
138  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
139 
140  if (currentModel == default)
141  return StatusCode((int)HttpStatusCode.Gone);
142 
143  //normalize github urls
144  const string BadGitHubUrl = "://www.github.com/";
145  var uiOrigin = model.Origin.ToUpperInvariant();
146  var uiBad = BadGitHubUrl.ToUpperInvariant();
147  var uiGitHub = Components.Repository.Repository.GitHubUrl.ToUpperInvariant();
148  if (uiOrigin.Contains(uiBad, StringComparison.Ordinal))
149  model.Origin = uiOrigin.Replace(uiBad, uiGitHub, StringComparison.Ordinal);
150 
151  currentModel.AccessToken = model.AccessToken;
152  currentModel.AccessUser = model.AccessUser; //intentionally only these fields, user not allowed to change anything else atm
153  var cloneBranch = model.Reference;
154  var origin = model.Origin;
155 
156  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
157 
158  if (repoManager.CloneInProgress)
159  return Conflict(new ErrorMessage
160  {
161  Message = "A clone operation is in progress!"
162  });
163 
164  if(repoManager.InUse)
165  return Conflict(new ErrorMessage
166  {
167  Message = "The repo is busy!"
168  });
169 
170  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
171  {
172  if (repo != null)
173  //clone conflict
174  return Conflict(new ErrorMessage
175  {
176  Message = "The repository already exists!"
177  });
178 
179  var job = new Models.Job
180  {
181  Description = String.Format(CultureInfo.InvariantCulture, "Clone branch {1} of repository {0}", origin, cloneBranch ?? "master"),
182  StartedBy = AuthenticationContext.User,
183  CancelRightsType = RightsType.Repository,
184  CancelRight = (ulong)RepositoryRights.CancelClone,
186  };
187  var api = currentModel.ToApi();
188  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
189  {
190  using (var repos = await repoManager.CloneRepository(new Uri(origin), cloneBranch, currentModel.AccessUser, currentModel.AccessToken, progressReporter, ct).ConfigureAwait(false))
191  {
192  if (repos == null)
193  throw new JobException("Filesystem conflict while cloning repository!");
194  var instance = new Models.Instance
195  {
196  Id = Instance.Id
197  };
198  databaseContext.Instances.Attach(instance);
199  if (await PopulateApi(api, repos, databaseContext, instance, ct).ConfigureAwait(false))
200  await databaseContext.Save(ct).ConfigureAwait(false);
201  }
202  }, cancellationToken).ConfigureAwait(false);
203 
204  api.Origin = model.Origin;
205  api.Reference = model.Reference;
206  api.ActiveJob = job.ToApi();
207 
208  return StatusCode((int)HttpStatusCode.Created, api);
209  }
210  }
211 
217  [TgsAuthorize(RepositoryRights.Delete)]
218  public async Task<IActionResult> Delete(CancellationToken cancellationToken)
219  {
220  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
221 
222  if (currentModel == default)
223  return StatusCode((int)HttpStatusCode.Gone);
224 
225  currentModel.AccessToken = null;
226  currentModel.AccessUser = null;
227 
228  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
229 
230  Logger.LogInformation("Instance {0} repository delete initiated by user {1}", Instance.Id, AuthenticationContext.User.Id);
231 
232  var job = new Models.Job
233  {
234  Description = "Delete repository",
235  StartedBy = AuthenticationContext.User,
237  };
238  var api = currentModel.ToApi();
239  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => instanceManager.GetInstance(Instance).RepositoryManager.DeleteRepository(cancellationToken), cancellationToken).ConfigureAwait(false);
240  api.ActiveJob = job.ToApi();
241  return Accepted(api);
242  }
243 
245  [TgsAuthorize(RepositoryRights.Read)]
246  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
247  {
248  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
249 
250  if (currentModel == default)
251  return StatusCode((int)HttpStatusCode.Gone);
252 
253  var api = currentModel.ToApi();
254  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
255 
256  if (repoManager.CloneInProgress)
257  return Conflict(new ErrorMessage
258  {
259  Message = "A clone operation is in progress!"
260  });
261 
262  if (repoManager.InUse)
263  return Conflict(new ErrorMessage
264  {
265  Message = "The repo is busy!"
266  });
267 
268  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
269  {
270  if (repo != null && await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false))
271  {
272  //user may have fucked with the repo without telling us, do what we can
273  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
274  return StatusCode((int)HttpStatusCode.Created, api);
275  }
276  return Json(api);
277  }
278  }
279 
281  [TgsAuthorize(RepositoryRights.ChangeAutoUpdateSettings | RepositoryRights.ChangeCommitter | RepositoryRights.ChangeCredentials | RepositoryRights.ChangeTestMergeCommits | RepositoryRights.MergePullRequest | RepositoryRights.SetReference | RepositoryRights.SetSha | RepositoryRights.UpdateBranch)]
282  public override async Task<IActionResult> Update([FromBody]Repository model, CancellationToken cancellationToken)
283  {
284  if (model == null)
285  throw new ArgumentNullException(nameof(model));
286 
287  if (model.AccessUser == null ^ model.AccessToken == null)
288  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
289 
290  if (model.CheckoutSha != null && model.Reference != null)
291  return BadRequest(new ErrorMessage { Message = "Only one of sha or reference may be specified!" });
292 
293  if (model.CheckoutSha != null && model.UpdateFromOrigin == true)
294  return BadRequest(new ErrorMessage { Message = "Cannot update a reference when checking out a sha!" });
295 
296  if (model.Origin != null)
297  return BadRequest(new ErrorMessage { Message = "origin cannot be modified without deleting the repository!" });
298 
299  if (model.NewTestMerges?.Any(x => !x.Number.HasValue) == true)
300  return BadRequest(new ErrorMessage { Message = "All new test merges must provide a number!" });
301 
302  if (model.NewTestMerges?.Any(x => model.NewTestMerges.Any(y => x != y && x.Number == y.Number)) == true)
303  return BadRequest(new ErrorMessage { Message = "Cannot test merge the same PR twice in one job!" });
304 
305  if (model.CommitterName?.Length == 0)
306  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer name!" });
307 
308  if (model.CommitterEmail?.Length == 0)
309  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer e=mail!" });
310 
311  var newTestMerges = model.NewTestMerges != null && model.NewTestMerges.Count > 0;
312  var userRights = (RepositoryRights)AuthenticationContext.GetRight(RightsType.Repository);
313  if (newTestMerges && !userRights.HasFlag(RepositoryRights.MergePullRequest))
314  return Forbid();
315 
316  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
317 
318  if (currentModel == default)
319  return StatusCode((int)HttpStatusCode.Gone);
320 
321  bool CheckModified<T>(Expression<Func<Api.Models.Internal.RepositorySettings, T>> expression, RepositoryRights requiredRight)
322  {
323  var memberSelectorExpression = (MemberExpression)expression.Body;
324  var property = (PropertyInfo)memberSelectorExpression.Member;
325 
326  var newVal = property.GetValue(model);
327  if (newVal == null)
328  return false;
329  if (!userRights.HasFlag(requiredRight) && property.GetValue(currentModel) != newVal)
330  return true;
331 
332  property.SetValue(currentModel, newVal);
333  return false;
334  };
335 
336  if (CheckModified(x => x.AccessToken, RepositoryRights.ChangeCredentials)
337  || CheckModified(x => x.AccessUser, RepositoryRights.ChangeCredentials)
338  || CheckModified(x => x.AutoUpdatesKeepTestMerges, RepositoryRights.ChangeAutoUpdateSettings)
339  || CheckModified(x => x.AutoUpdatesSynchronize, RepositoryRights.ChangeAutoUpdateSettings)
340  || CheckModified(x => x.CommitterEmail, RepositoryRights.ChangeCommitter)
341  || CheckModified(x => x.CommitterName, RepositoryRights.ChangeCommitter)
342  || CheckModified(x => x.PushTestMergeCommits, RepositoryRights.ChangeTestMergeCommits)
343  || CheckModified(x => x.ShowTestMergeCommitters, RepositoryRights.ChangeTestMergeCommits)
344  || (model.UpdateFromOrigin == true && !userRights.HasFlag(RepositoryRights.UpdateBranch)))
345  return Forbid();
346 
347  if (currentModel.AccessToken?.Length == 0 && currentModel.AccessUser?.Length == 0)
348  {
349  //setting an empty string clears everything
350  currentModel.AccessUser = null;
351  currentModel.AccessToken = null;
352  }
353 
354  var canRead = userRights.HasFlag(RepositoryRights.Read);
355 
356  var api = canRead ? currentModel.ToApi() : new Repository();
357  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
358 
359  if (canRead)
360  {
361  if (repoManager.CloneInProgress)
362  return Conflict(new ErrorMessage
363  {
364  Message = "A clone operation is in progress!"
365  });
366 
367  if (repoManager.InUse)
368  return Conflict(new ErrorMessage
369  {
370  Message = "The repo is busy!"
371  });
372 
373  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
374  {
375  if (repo == null)
376  return Conflict(new ErrorMessage
377  {
378  Message = "Repository could not be loaded!"
379  });
380  await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false);
381  }
382  }
383 
384  //this is just db stuf so stow it away
385  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
386 
387  //format the job description
388  string description = null;
389  if (model.UpdateFromOrigin == true)
390  if (model.Reference != null)
391  description = String.Format(CultureInfo.InvariantCulture, "Fetch and hard reset repository to origin/{0}", model.Reference);
392  else if (model.CheckoutSha != null)
393  description = String.Format(CultureInfo.InvariantCulture, "Fetch and checkout {0} in repository", model.CheckoutSha);
394  else
395  description = "Pull current repository reference";
396  else if (model.Reference != null || model.CheckoutSha != null)
397  description = String.Format(CultureInfo.InvariantCulture, "Checkout repository {0} {1}", model.Reference != null ? "reference" : "SHA", model.Reference ?? model.CheckoutSha);
398 
399  if (newTestMerges)
400  description = String.Format(CultureInfo.InvariantCulture, "{0}est merge pull request(s) {1}{2}",
401  description != null ? String.Format(CultureInfo.InvariantCulture, "{0} and t", description) : "T",
402  String.Join(", ", model.NewTestMerges.Select(x =>
403  String.Format(CultureInfo.InvariantCulture, "#{0}{1}", x.Number,
404  x.PullRequestRevision != null ? String.Format(CultureInfo.InvariantCulture, " at {0}", x.PullRequestRevision.Substring(0, 7)) : String.Empty))),
405  description != null ? String.Empty : " in repository");
406 
407  if (description == null)
408  //no git changes
409  return Json(api);
410 
411  var job = new Models.Job
412  {
413  Description = description,
414  StartedBy = AuthenticationContext.User,
415  Instance = Instance,
416  CancelRightsType = RightsType.Repository,
417  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
418  };
419 
420  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
421  {
422  using (var repo = await repoManager.LoadRepository(ct).ConfigureAwait(false))
423  {
424  if (repo == null)
425  throw new JobException("Repository could not be loaded!");
426 
427  var modelHasShaOrReference = model.CheckoutSha != null || model.Reference != null;
428 
429  var startReference = repo.Reference;
430  var startSha = repo.Head;
431  string postUpdateSha = null;
432 
433  if (newTestMerges && !repo.IsGitHubRepository)
434  throw new JobException("Cannot test merge on a non GitHub based repository!");
435 
436  var committerName = currentModel.ShowTestMergeCommitters.Value ? AuthenticationContext.User.Name : currentModel.CommitterName;
437 
438  var hardResettingToOriginReference = model.UpdateFromOrigin == true && model.Reference != null;
439 
440  var numSteps = (model.NewTestMerges?.Count ?? 0) + (model.UpdateFromOrigin == true ? 1 : 0) + (!modelHasShaOrReference ? 2 : (hardResettingToOriginReference ? 3 : 1));
441  var doneSteps = 0;
442 
443  Action<int> NextProgressReporter()
444  {
445  var tmpDoneSteps = doneSteps;
446  ++doneSteps;
447  return progress => progressReporter((progress + 100 * tmpDoneSteps) / numSteps);
448  };
449 
450  progressReporter(0);
451 
452  //get a base line for where we are
453  Models.RevisionInformation lastRevisionInfo = null;
454 
455  var attachedInstance = new Models.Instance
456  {
457  Id = Instance.Id
458  };
459  databaseContext.Instances.Attach(attachedInstance);
460 
461  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
462 
463  //apply new rev info, tracking applied test merges
464  async Task UpdateRevInfo()
465  {
466  var last = lastRevisionInfo;
467  await LoadRevisionInformation(repo, databaseContext, attachedInstance, last.OriginCommitSha, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
468  lastRevisionInfo.ActiveTestMerges.AddRange(last.ActiveTestMerges);
469  };
470 
471  try
472  {
473  //fetch/pull
474  if (model.UpdateFromOrigin == true)
475  {
476  if (!repo.Tracking)
477  throw new JobException("Not on an updatable reference!");
478  await repo.FetchOrigin(currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
479  doneSteps = 1;
480  if (!modelHasShaOrReference)
481  {
482  var fastForward = await repo.MergeOrigin(committerName, currentModel.CommitterEmail, NextProgressReporter(), ct).ConfigureAwait(false);
483  if (!fastForward.HasValue)
484  throw new JobException("Merge conflict occurred during origin update!");
485  await UpdateRevInfo().ConfigureAwait(false);
486  if (fastForward.Value)
487  {
488  lastRevisionInfo.OriginCommitSha = repo.Head;
489  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
490  postUpdateSha = repo.Head;
491  }
492  else
493  NextProgressReporter()(100);
494  }
495  }
496 
497  //checkout/hard reset
498  if (modelHasShaOrReference)
499  {
500  if ((model.CheckoutSha != null && repo.Head.ToUpperInvariant().StartsWith(model.CheckoutSha.ToUpperInvariant(), StringComparison.Ordinal))
501  || (model.Reference != null && repo.Reference.ToUpperInvariant() != model.Reference.ToUpperInvariant()))
502  {
503  var committish = model.CheckoutSha ?? model.Reference;
504  var isSha = await repo.IsSha(committish, cancellationToken).ConfigureAwait(false);
505 
506  if ((isSha && model.Reference != null) || (!isSha && model.CheckoutSha != null))
507  throw new JobException("Attempted to checkout a SHA or reference that was actually the opposite!");
508 
509  await repo.CheckoutObject(committish, NextProgressReporter(), ct).ConfigureAwait(false);
510  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
511  }
512  else
513  NextProgressReporter()(100);
514 
515  if (hardResettingToOriginReference)
516  {
517  if (!repo.Tracking)
518  throw new JobException("Checked out reference does not track a remote object!");
519  await repo.ResetToOrigin(NextProgressReporter(), ct).ConfigureAwait(false);
520  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
521  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
522  //repo head is on origin so force this
523  //will update the db if necessary
524  lastRevisionInfo.OriginCommitSha = repo.Head;
525  }
526  }
527 
528  Dictionary<int, Octokit.PullRequest> prMap = null;
529  //test merging
530  if (newTestMerges)
531  {
532  //bit of sanitization
533  foreach (var I in model.NewTestMerges.Where(x => String.IsNullOrWhiteSpace(x.PullRequestRevision)))
534  I.PullRequestRevision = null;
535 
536  var gitHubClient = currentModel.AccessToken != null
537  ? gitHubClientFactory.CreateClient(currentModel.AccessToken)
538  : (String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken)
539  ? gitHubClientFactory.CreateClient()
540  : gitHubClientFactory.CreateClient(generalConfiguration.GitHubAccessToken));
541 
542  var repoOwner = repo.GitHubOwner;
543  var repoName = repo.GitHubRepoName;
544 
545  Models.RevisionInformation revInfoWereLookingFor = null;
546  bool needToApplyRemainingPrs = true;
547  //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
548  if (lastRevisionInfo.OriginCommitSha == lastRevisionInfo.CommitSha)
549  {
550  //In order for this to work though we need the shas of all the commits
551  if (model.NewTestMerges.Any(x => x.PullRequestRevision == null))
552  prMap = new Dictionary<int, Octokit.PullRequest>();
553 
554  bool cantSearch = false;
555  foreach (var I in model.NewTestMerges)
556  {
557  if (I.PullRequestRevision != null)
558  //normalize the shas to lowercase ala libgit2
559 #pragma warning disable CA1308 // Normalize strings to uppercase
560  I.PullRequestRevision = I.PullRequestRevision?.ToLowerInvariant();
561 #pragma warning restore CA1308 // Normalize strings to uppercase
562  else
563  //retrieve the latest sha
564  try
565  {
566  var pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
567  prMap.Add(I.Number.Value, pr);
568  I.PullRequestRevision = pr.Head.Sha;
569  }
570  catch
571  {
572  cantSearch = true;
573  break;
574  }
575  }
576 
577  if (!cantSearch)
578  {
579  var dbPull = await databaseContext.RevisionInformations
580  .Where(x => x.Instance.Id == Instance.Id
581  && x.OriginCommitSha == lastRevisionInfo.OriginCommitSha
582  && x.ActiveTestMerges.Count <= model.NewTestMerges.Count
583  && x.ActiveTestMerges.Count > 0)
584  .Include(x => x.ActiveTestMerges)
585  .ThenInclude(x => x.TestMerge)
586  .ToListAsync(cancellationToken).ConfigureAwait(false);
587 
588  //split here cause this bit has to be done locally
589  revInfoWereLookingFor = dbPull
590  .Where(x => x.ActiveTestMerges.Count == model.NewTestMerges.Count
591  && x.ActiveTestMerges.Select(y => y.TestMerge)
592  .All(y => model.NewTestMerges.Any(z =>
593  y.Number == z.Number
594  && y.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
595  && (y.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))))
596  .FirstOrDefault();
597 
598  if (revInfoWereLookingFor == null && model.NewTestMerges.Count > 1)
599  {
600  //okay try to add at least SOME prs we've seen before
601  var search = model.NewTestMerges.ToList();
602 
603  var appliedTestMergeIds = new List<long>();
604 
605  Models.RevisionInformation lastGoodRevInfo = null;
606  do
607  {
608  foreach (var I in search)
609  {
610  revInfoWereLookingFor = dbPull
611  .Where(x => model.NewTestMerges.Any(z =>
612  x.PrimaryTestMerge.Number == z.Number
613  && x.PrimaryTestMerge.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
614  && (x.PrimaryTestMerge.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))
615  && x.ActiveTestMerges.Select(y => y.TestMerge).All(y => appliedTestMergeIds.Contains(y.Id)))
616  .FirstOrDefault();
617 
618  if (revInfoWereLookingFor != null)
619  {
620  lastGoodRevInfo = revInfoWereLookingFor;
621  appliedTestMergeIds.Add(revInfoWereLookingFor.PrimaryTestMerge.Id);
622  search.Remove(I);
623  break;
624  }
625  }
626  } while (revInfoWereLookingFor != null && search.Count > 0);
627 
628  revInfoWereLookingFor = lastGoodRevInfo;
629  needToApplyRemainingPrs = search.Count != 0;
630  if (needToApplyRemainingPrs)
631  model.NewTestMerges = search;
632  }
633  else if (revInfoWereLookingFor != null)
634  needToApplyRemainingPrs = false;
635  }
636  }
637 
638  if (revInfoWereLookingFor != null)
639  {
640  //goteem
641  await repo.ResetToSha(revInfoWereLookingFor.CommitSha, NextProgressReporter(), cancellationToken).ConfigureAwait(false);
642  lastRevisionInfo = revInfoWereLookingFor;
643  }
644 
645  if (needToApplyRemainingPrs)
646  {
647  //an invocation of LoadRevisionInformation could have already loaded this user
648  var contextUser = databaseContext.Users.Local.Where(x => x.Id == AuthenticationContext.User.Id).FirstOrDefault();
649  if (contextUser == default)
650  {
651  contextUser = new Models.User
652  {
654  };
655  databaseContext.Users.Attach(contextUser);
656  }
657  else
658  Logger.LogTrace("Skipping attaching the user to the database context as it is already loaded!");
659 
660  foreach (var I in model.NewTestMerges)
661  {
662  Octokit.PullRequest pr = null;
663  string errorMessage = null;
664 
665  if (lastRevisionInfo.ActiveTestMerges.Any(x => x.TestMerge.Number == I.Number.Value))
666  throw new JobException("Cannot test merge the same PR twice in one HEAD!");
667 
668  try
669  {
670  //load from cache if possible
671  if (prMap == null || !prMap.TryGetValue(I.Number.Value, out pr))
672  pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
673  }
674  catch (Octokit.RateLimitExceededException)
675  {
676  //you look at your anonymous access and sigh
677  errorMessage = "P.R.E. RATE LIMITED";
678  }
679  catch (Octokit.AuthorizationException)
680  {
681  errorMessage = "P.R.E. BAD CREDENTIALS";
682  }
683  catch (Octokit.NotFoundException)
684  {
685  //you look at your shithub and sigh
686  errorMessage = "P.R.E. NOT FOUND";
687  }
688 
689  //we want to take the earliest truth possible to prevent RCEs, if this fails AddTestMerge will set it
690  if (I.PullRequestRevision == null && pr != null)
691  I.PullRequestRevision = pr.Head.Sha;
692 
693  var mergeResult = await repo.AddTestMerge(I, committerName, currentModel.CommitterEmail, currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
694 
695  if (!mergeResult.HasValue)
696  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Merge of PR #{0} at {1} conflicted!", I.Number, I.PullRequestRevision.Substring(0, 7)));
697 
698  ++doneSteps;
699 
700  var revInfoUpdateTask = UpdateRevInfo();
701 
702  var tm = new Models.TestMerge
703  {
704  Author = pr?.User.Login ?? errorMessage,
705  BodyAtMerge = pr?.Body ?? errorMessage ?? String.Empty,
706  MergedAt = DateTimeOffset.Now,
707  TitleAtMerge = pr?.Title ?? errorMessage ?? String.Empty,
708  Comment = I.Comment,
709  Number = I.Number,
710  MergedBy = contextUser,
711  PullRequestRevision = I.PullRequestRevision,
712  Url = pr?.HtmlUrl ?? errorMessage
713  };
714 
715  await revInfoUpdateTask.ConfigureAwait(false);
716 
717  lastRevisionInfo.PrimaryTestMerge = tm;
718  lastRevisionInfo.ActiveTestMerges.Add(new RevInfoTestMerge
719  {
720  TestMerge = tm
721  });
722  }
723  }
724  }
725 
726  var currentHead = repo.Head;
727  if (startSha != currentHead || (postUpdateSha != null && postUpdateSha != currentHead))
728  {
729  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), false, ct).ConfigureAwait(false);
730  await UpdateRevInfo().ConfigureAwait(false);
731  }
732  await databaseContext.Save(ct).ConfigureAwait(false);
733  }
734  catch
735  {
736  doneSteps = 0;
737  numSteps = 2;
738  //the stuff didn't make it into the db, forget what we've done and abort
739  await repo.CheckoutObject(startReference ?? startSha, NextProgressReporter(), default).ConfigureAwait(false);
740  if (startReference != null && repo.Head != startSha)
741  await repo.ResetToSha(startSha, NextProgressReporter(), default).ConfigureAwait(false);
742  else
743  progressReporter(100);
744  throw;
745  }
746  }
747  }, cancellationToken).ConfigureAwait(false);
748 
749  api.ActiveJob = job.ToApi();
750  return Accepted(api);
751  }
752  }
753 }
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 GitHubOwner
If the repository was cloned from GitHub.com this will be set with the owner of the repository ...
Definition: Repository.cs:28
+ + + + + +
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)
+ + +
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
+
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
+
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
+ + +
override async Task< IActionResult > Create([FromBody] Repository model, CancellationToken cancellationToken)
+
string Origin
The origin URL. If , 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..52c9e80195 --- /dev/null +++ b/_repository_manager_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..fd0d7c2605 --- /dev/null +++ b/_repository_manager_8cs_source.html @@ -0,0 +1,139 @@ + + + + + + +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 
10 namespace Tgstation.Server.Host.Components.Repository
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 
65  public RepositoryManager(RepositorySettings repositorySettings, IIOManager ioManager, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger<Repository> repositoryLogger, ILogger<RepositoryManager> logger)
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  try
99  {
100  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
101  {
102  logger.LogTrace("Semaphore acquired");
103  if (!await ioManager.DirectoryExists(".", cancellationToken).ConfigureAwait(false))
104  try
105  {
106  await Task.Factory.StartNew(() =>
107  {
108  string path = null;
109  try
110  {
111  path = LibGit2Sharp.Repository.Clone(url.ToString(), ioManager.ResolvePath("."), new CloneOptions
112  {
113  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
114  OnTransferProgress = (a) =>
115  {
116  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
117  progressReporter((int)percentage);
118  return !cancellationToken.IsCancellationRequested;
119  },
120  RecurseSubmodules = true,
121  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
122  RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
123  BranchName = initialBranch,
124  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
125  });
126  }
127  catch (UserCancelledException) { }
128  cancellationToken.ThrowIfCancellationRequested();
129  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
130  }
131  catch
132  {
133  try
134  {
135  logger.LogTrace("Deleting partially cloned repository...");
136  await ioManager.DeleteDirectory(".", default).ConfigureAwait(false);
137  }
138  catch (Exception e)
139  {
140  logger.LogDebug("Error deleting partially cloned repository! Exception: {0}", e);
141  }
142  throw;
143  }
144  else
145  {
146  logger.LogDebug("Repository exists, clone aborted!");
147  return null;
148  }
149  }
150  logger.LogInformation("Clone complete!");
151  }
152  finally
153  {
154  CloneInProgress = false;
155  }
156  return await LoadRepository(cancellationToken).ConfigureAwait(false);
157  }
158 
160  public async Task<IRepository> LoadRepository(CancellationToken cancellationToken)
161  {
162  logger.LogTrace("Begin LoadRepository...");
163  lock (this)
164  if (CloneInProgress)
165  throw new InvalidOperationException("The repository is being cloned!");
166  await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
167  LibGit2Sharp.Repository repo = null;
168  await Task.Factory.StartNew(() =>
169  {
170  try
171  {
172  logger.LogTrace("Creating LibGit2Sharp.Repository...");
173  repo = new LibGit2Sharp.Repository(ioManager.ResolvePath("."));
174  }
175  catch (RepositoryNotFoundException e)
176  {
177  logger.LogDebug("Repository not found!");
178  logger.LogTrace("Exception: {0}", e);
179  }
180  catch
181  {
182  semaphore.Release();
183  throw;
184  }
185  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
186  if (repo == null)
187  {
188  semaphore.Release();
189  return null;
190  }
191  return new Repository(repo, ioManager, eventConsumer, credentialsProvider, repositoryLogger, () =>
192  {
193  logger.LogTrace("Releasing semaphore due to Repository disposal...");
194  semaphore.Release();
195  });
196  }
197 
199  public async Task DeleteRepository(CancellationToken cancellationToken)
200  {
201  logger.LogInformation("Deleting repository...");
202  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
203  {
204  logger.LogTrace("Semaphore acquired, deleting Repository directory...");
205  await ioManager.DeleteDirectory(".", cancellationToken).ConfigureAwait(false);
206  }
207  }
208  }
209 }
+
Represents configurable settings for a Repository
+
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
+
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+
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
+ +
Factory for creating and loading IRepositorys
+ + + +
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
+ +
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..11a03b326d --- /dev/null +++ b/_repository_rights_8cs.html @@ -0,0 +1,139 @@ + + + + + + +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..4f0224ee5e --- /dev/null +++ b/_repository_rights_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Rights
4 {
8  [Flags]
9  public enum RepositoryRights : ulong
10  {
14  None = 0,
22  SetOrigin = 2,
26  SetSha = 4,
30  MergePullRequest = 8,
34  UpdateBranch = 16,
38  ChangeCommitter = 32,
46  ChangeCredentials = 128,
50  SetReference = 256,
54  Read = 512,
62  Delete = 2048,
66  CancelClone = 4096
67  }
68 }
+
User may change Models.Internal.RepositorySettings.AutoUpdatesKeepTestMerges and Models.Internal.RepositorySettings.AutoUpdatesSynchronize
+ + +
User may fetch and merge GitHub pull requests
+
User may change Models.Internal.RepositorySettings.PushTestMergeCommits
+ + + +
RepositoryRights
Rights for a Models.Repository
+
User may directly set the sha the Models.Repository&#39;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.Internal.RepositorySettings.AccessToken
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+ +
User may change Models.Internal.RepositorySettings.CommitterName and Models.Internal.RepositorySettings.CommitterEmail
+
+ + + + diff --git a/_request_timeout_exception_8cs.html b/_request_timeout_exception_8cs.html new file mode 100644 index 0000000000..37184c968c --- /dev/null +++ b/_request_timeout_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_request_timeout_exception_8cs_source.html b/_request_timeout_exception_8cs_source.html new file mode 100644 index 0000000000..6a599cdf1e --- /dev/null +++ b/_request_timeout_exception_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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..bd306b900d --- /dev/null +++ b/_resolving_i_o_manager_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..72fc51252e --- /dev/null +++ b/_resolving_i_o_manager_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.IO
5 {
10  {
14  readonly string subdirectory;
15 
21  public ResolvingIOManager(IIOManager parent, string _subdirectory)
22  {
23  if (parent == null)
24  throw new ArgumentNullException(nameof(parent));
25  if (_subdirectory == null)
26  throw new ArgumentNullException(nameof(_subdirectory));
27 
28  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 }
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...
+
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
+
ResolvingIOManager(IIOManager parent, string _subdirectory)
Construct a ResolvingIOManager
+ +
+ + + + diff --git a/_response_8cs.html b/_response_8cs.html new file mode 100644 index 0000000000..4b8a7d02b6 --- /dev/null +++ b/_response_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_response_8cs_source.html b/_response_8cs_source.html new file mode 100644 index 0000000000..04f23dd36c --- /dev/null +++ b/_response_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Components.Chat
4 {
8  sealed class Response
9  {
13  public string Message { get; set; }
14 
18  public List<ulong> ChannelIds { get; set; }
19  }
20 }
+ + +
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..c241f991da --- /dev/null +++ b/_restart_registration_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/RestartRegistration.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestartRegistration.cs File Reference
+
+ + + + + diff --git a/_restart_registration_8cs_source.html b/_restart_registration_8cs_source.html new file mode 100644 index 0000000000..075e864128 --- /dev/null +++ b/_restart_registration_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Core
4 {
7  {
11  readonly Action onDispose;
12 
17  public RestartRegistration(Action onDispose)
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..ec6438c052 --- /dev/null +++ b/_rev_info_test_merge_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..caffe4db2d --- /dev/null +++ b/_rev_info_test_merge_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
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..397bc8a15c --- /dev/null +++ b/_revision_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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..efd6f09fbb --- /dev/null +++ b/_revision_command_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
10 namespace Tgstation.Server.Host.Components.Chat.Commands
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 
47  public RevisionCommand(IWatchdog watchdog, IRepositoryManager repositoryManager, Models.Instance instance)
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
+ + +
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
+
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
+ +
Factory for creating and loading IRepositorys
+ + +
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..d89b2fee5f --- /dev/null +++ b/_rights_helper_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Rights
 
+
+ + + + diff --git a/_rights_helper_8cs_source.html b/_rights_helper_8cs_source.html new file mode 100644 index 0000000000..cb65635b7d --- /dev/null +++ b/_rights_helper_8cs_source.html @@ -0,0 +1,118 @@ + + + + + + +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 
5 namespace Tgstation.Server.Api.Rights
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 
20  { RightsType.Repository, typeof(RepositoryRights) },
21  { RightsType.Byond, typeof(ByondRights) },
22  { RightsType.DreamMaker, typeof(DreamMakerRights) },
23  { RightsType.DreamDaemon, typeof(DreamDaemonRights) },
24  { RightsType.ChatBots, typeof(ChatBotRights) },
25  { RightsType.Configuration, typeof(ConfigurationRights) },
26  { RightsType.InstanceUser, typeof(InstanceUserRights) }
27  };
28 
34  public static Type RightToType(RightsType rightsType) => typeMap[rightsType];
35 
42  public static string RoleNames<TRight>(TRight right) where TRight : Enum
43  {
44  var flags = new List<string>();
45  IEnumerable<string> GetRoleNames()
46  {
47  foreach (Enum J in Enum.GetValues(right.GetType()))
48  if (Convert.ToInt32(J, CultureInfo.InvariantCulture) != 0 && right.HasFlag(J))
49  yield return String.Concat(typeof(TRight).Name, '.', J.ToString());
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 }
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
+
DreamMakerRights
Rights for Models.DreamMaker
+
RepositoryRights
Rights for a Models.Repository
+
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..edd26cca09 --- /dev/null +++ b/_rights_type_8cs.html @@ -0,0 +1,133 @@ + + + + + + +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..197cfb78ef --- /dev/null +++ b/_rights_type_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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..3f26c0121a --- /dev/null +++ b/_routes_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api
 
+
+ + + + diff --git a/_routes_8cs_source.html b/_routes_8cs_source.html new file mode 100644 index 0000000000..6e4befd909 --- /dev/null +++ b/_routes_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 }
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
+ + + + diff --git a/_semaphore_slim_context_8cs.html b/_semaphore_slim_context_8cs.html new file mode 100644 index 0000000000..fe2b37222d --- /dev/null +++ b/_semaphore_slim_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..3d5ad71763 --- /dev/null +++ b/_semaphore_slim_context_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Core
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 
41  SemaphoreSlimContext(SemaphoreSlim lockedSemaphore) => this.lockedSemaphore = lockedSemaphore;
42 
46 #pragma warning disable CA1821 // Remove empty Finalizers //TODO remove this when https://github.com/dotnet/roslyn-analyzers/issues/1241 is fixed
47  ~SemaphoreSlimContext() => Dispose();
48 #pragma warning restore CA1821 // Remove empty Finalizers
49 
53  public void Dispose()
54  {
55  lock (this)
56  {
57  if (disposed)
58  return;
59  disposed = true;
60  }
61  GC.SuppressFinalize(this);
62  lockedSemaphore.Release();
63  }
64  }
65 }
+ +
readonly SemaphoreSlim lockedSemaphore
The locked SemaphoreSlim
+ +
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..bad8ff54df --- /dev/null +++ b/_server_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host
 
+
+ + + + diff --git a/_server_8cs_source.html b/_server_8cs_source.html new file mode 100644 index 0000000000..e24e7e710f --- /dev/null +++ b/_server_8cs_source.html @@ -0,0 +1,134 @@ + + + + + + +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 System;
5 using System.Collections.Generic;
6 using System.IO;
7 using System.Linq;
8 using System.Threading;
9 using System.Threading.Tasks;
11 using Tgstation.Server.Host.IO;
12 
13 namespace Tgstation.Server.Host
14 {
16 #pragma warning disable CA1001 // Types that own disposable fields should be disposable
17  sealed class Server : IServer, IServerControl
18 #pragma warning restore CA1001 // Types that own disposable fields should be disposable
19  {
21  public bool RestartRequested { get; private set; }
22 
24  public bool WatchdogPresent => updatePath != null;
25 
29  readonly IWebHostBuilder webHostBuilder;
30 
34  readonly List<IRestartHandler> restartHandlers;
35 
39  readonly string updatePath;
40 
44  ILogger<Server> logger;
45 
49  CancellationTokenSource cancellationTokenSource;
50 
54  bool updating;
55 
61  public Server(IWebHostBuilder webHostBuilder, string updatePath)
62  {
63  this.webHostBuilder = webHostBuilder ?? throw new ArgumentNullException(nameof(webHostBuilder));
64  this.updatePath = updatePath;
65 
66  restartHandlers = new List<IRestartHandler>();
67  }
68 
73  void CheckSanity(bool checkWatchdog)
74  {
75  if (checkWatchdog && !WatchdogPresent)
76  throw new InvalidOperationException("Server restarts are not supported");
77 
78  if (cancellationTokenSource == null || logger == null)
79  throw new InvalidOperationException("Tried to control a non-running Server!");
80  }
81 
83  public async Task RunAsync(CancellationToken cancellationToken)
84  {
85  using (cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
86  using (var fsWatcher = updatePath != null ? new FileSystemWatcher(Path.GetDirectoryName(updatePath)) : null)
87  {
88  if (fsWatcher != null)
89  {
90  fsWatcher.Created += (a, b) =>
91  {
92  if (b.FullPath == updatePath && File.Exists(b.FullPath))
93  cancellationTokenSource.Cancel();
94  };
95  fsWatcher.EnableRaisingEvents = true;
96  }
97  using (var webHost = webHostBuilder
98  .UseStartup<Application>()
99  .ConfigureServices(serviceCollection => serviceCollection.AddSingleton<IServerControl>(this))
100  .Build()
101  )
102  {
103  logger = webHost.Services.GetRequiredService<ILogger<Server>>();
104  await webHost.RunAsync(cancellationTokenSource.Token).ConfigureAwait(false);
105  }
106  }
107  }
108 
110  public bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager)
111  {
112  if (version == null)
113  throw new ArgumentNullException(nameof(version));
114  if (updateZipUrl == null)
115  throw new ArgumentNullException(nameof(updateZipUrl));
116  if (ioManager == null)
117  throw new ArgumentNullException(nameof(ioManager));
118 
119  CheckSanity(true);
120 
121  logger.LogTrace("Begin ApplyUpdate...");
122 
123  lock (this)
124  {
125  if (updating || RestartRequested)
126  {
127  logger.LogTrace("Aborted due to concurrency conflict!");
128  return false;
129  }
130  updating = true;
131  }
132 
133  async void RunUpdate()
134  {
135  try
136  {
137  logger.LogInformation("Updating server to version {0} ({1})...", version, updateZipUrl);
138 
139  if (cancellationTokenSource == null)
140  throw new InvalidOperationException("Tried to update a non-running Server!");
141  var cancellationToken = cancellationTokenSource.Token;
142 
143  logger.LogTrace("Downloading zip package...");
144  var updateZipData = await ioManager.DownloadFile(updateZipUrl, cancellationToken).ConfigureAwait(false);
145 
146  try
147  {
148  logger.LogTrace("Exctracting zip package to {0}...", updatePath);
149  await ioManager.ZipToDirectory(updatePath, updateZipData, cancellationToken).ConfigureAwait(false);
150  }
151  catch (Exception e)
152  {
153  updating = false;
154  try
155  {
156  //important to not leave this directory around if possible
157  await ioManager.DeleteDirectory(updatePath, default).ConfigureAwait(false);
158  }
159  catch (Exception e2)
160  {
161  throw new AggregateException(e, e2);
162  }
163  throw;
164  }
165 
166  await Restart(version).ConfigureAwait(false);
167  }
168  catch (OperationCanceledException)
169  {
170  logger.LogInformation("Server update cancelled!");
171  }
172  catch (Exception e)
173  {
174  logger.LogError("Error updating server! Exception: {0}", e);
175  }
176  finally
177  {
178  updating = false;
179  }
180  }
181 
182  RunUpdate();
183  return true;
184  }
185 
188  {
189  if (handler == null)
190  throw new ArgumentNullException(nameof(handler));
191 
192  CheckSanity(false);
193 
194  lock (this)
195  if (!RestartRequested)
196  {
197  logger.LogTrace("Registering restart handler {0}...", handler);
198  restartHandlers.Add(handler);
199  return new RestartRegistration(() =>
200  {
201  lock (this)
202  if (!RestartRequested)
203  restartHandlers.Remove(handler);
204  });
205  }
206  return new RestartRegistration(() => { });
207  }
208 
210  public Task Restart() => Restart(null);
211 
217  async Task Restart(Version newVersion)
218  {
219  CheckSanity(true);
220 
221  logger.LogTrace("Begin Restart...");
222 
223  lock (this)
224  {
225  if ((updating && newVersion == null) || RestartRequested)
226  {
227  logger.LogTrace("Aborted due to concurrency conflict!");
228  return;
229  }
230  RestartRequested = true;
231  }
232 
233  logger.LogInformation("Restarting server...");
234 
235  using (var cts = new CancellationTokenSource())
236  {
237  logger.LogTrace("Running restart handlers...");
238  var cancellationToken = cts.Token;
239  var eventsTask = Task.WhenAll(restartHandlers.Select(x => x.HandleRestart(newVersion, cancellationToken)).ToList());
240  //YA GOT 10 SECONDS
241  var expiryTask = Task.Delay(TimeSpan.FromSeconds(10));
242  await Task.WhenAny(eventsTask, expiryTask).ConfigureAwait(false);
243  logger.LogTrace("Joining restart handlers...");
244  cts.Cancel();
245  try
246  {
247  await eventsTask.ConfigureAwait(false);
248  }
249  catch (OperationCanceledException) { }
250  catch (Exception e)
251  {
252  logger.LogError("Restart handlers error! Exception: {0}", e);
253  }
254  }
255 
256  logger.LogTrace("Stopping host...");
257  cancellationTokenSource.Cancel();
258  }
259  }
260 }
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:44
+
async Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
Definition: Server.cs:83
+
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:110
+
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:34
+ +
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:187
+
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:39
+
Represents the host
Definition: IServer.cs:9
+
Server(IWebHostBuilder webHostBuilder, string updatePath)
Construct a Server
Definition: Server.cs:61
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:49
+
bool updating
If a server update has been or is being applied
Definition: Server.cs:54
+ + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
async Task Restart(Version newVersion)
Implements Restart()
Definition: Server.cs:217
+
Represents the lifetime of a IRestartHandler registration
+ +
readonly IWebHostBuilder webHostBuilder
The IWebHostBuilder for the Server
Definition: Server.cs:29
+ +
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:73
+ +
+ + + + diff --git a/_server_client_8cs.html b/_server_client_8cs.html new file mode 100644 index 0000000000..2428b9f16d --- /dev/null +++ b/_server_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_server_client_8cs_source.html b/_server_client_8cs_source.html new file mode 100644 index 0000000000..acd64c464e --- /dev/null +++ b/_server_client_8cs_source.html @@ -0,0 +1,132 @@ + + + + + + +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 
7 namespace Tgstation.Server.Client
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!");
22  apiClient.Headers = new ApiHeaders(apiClient.Headers.UserAgent, token.Bearer);
23  }
24  }
25 
27  public TimeSpan Timeout
28  {
29  get => apiClient.Timeout;
30  set => apiClient.Timeout = value;
31  }
32 
34  public IInstanceManagerClient Instances { get; }
35 
38 
40  public IUsersClient Users { get; }
41 
46 
51 
57  public ServerClient(IApiClient apiClient, Token token)
58  {
59  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
60  this.token = token ?? throw new ArgumentNullException(nameof(token));
61 
62  if (Token.Bearer != apiClient.Headers.Token)
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  }
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
+ + +
Token token
Backing field for Token
Definition: ServerClient.cs:50
+ + + + + +
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
+
Uri Url
The connected server Uri
+ +
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
+ + +
Web interface for the API
Definition: IApiClient.cs:11
+
string Token
The client&#39;s JWT
Definition: ApiHeaders.cs:76
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+ +
+ + + + diff --git a/_server_client_factory_8cs.html b/_server_client_factory_8cs.html new file mode 100644 index 0000000000..b3bac5a504 --- /dev/null +++ b/_server_client_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_server_client_factory_8cs_source.html b/_server_client_factory_8cs_source.html new file mode 100644 index 0000000000..64178434de --- /dev/null +++ b/_server_client_factory_8cs_source.html @@ -0,0 +1,125 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client
9 {
12  {
16  static readonly IApiClientFactory apiClientFactory = new ApiClientFactory();
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  return CreateServerClient(host, token, timeout);
50  }
51 
53  public IServerClient CreateServerClient(Uri host, Token token, TimeSpan timeout)
54  {
55  if (host == null)
56  throw new ArgumentNullException(nameof(host));
57  if (token == null)
58  throw new ArgumentNullException(nameof(token));
59  var result = new ServerClient(apiClientFactory.CreateApiClient(host, new ApiHeaders(productHeaderValue, token.Bearer)), token);
60  if (timeout != default)
61  result.Timeout = timeout;
62  return result;
63  }
64  }
65 }
+ + + + +
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
+
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
+ +
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..a63ba16ffa --- /dev/null +++ b/_server_error_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_server_error_exception_8cs_source.html b/_server_error_exception_8cs_source.html new file mode 100644 index 0000000000..d4ced35b44 --- /dev/null +++ b/_server_error_exception_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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..6d12c87011 --- /dev/null +++ b/_server_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host
 
+
+ + + + diff --git a/_server_factory_8cs_source.html b/_server_factory_8cs_source.html new file mode 100644 index 0000000000..8e8d746199 --- /dev/null +++ b/_server_factory_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 System;
3 
4 namespace Tgstation.Server.Host
5 {
7  public sealed class ServerFactory : IServerFactory
8  {
10  public IServer CreateServer(string[] args, string updatePath) => new Server(WebHost.CreateDefaultBuilder(args ?? throw new ArgumentNullException(nameof(args))), updatePath);
11  }
12 }
+ + + +
Represents the host
Definition: IServer.cs:9
+ + +
+ + + + diff --git a/_server_information_8cs.html b/_server_information_8cs.html new file mode 100644 index 0000000000..96351a766d --- /dev/null +++ b/_server_information_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Models
 
+
+ + + + diff --git a/_server_information_8cs_source.html b/_server_information_8cs_source.html new file mode 100644 index 0000000000..b7ba37a7c3 --- /dev/null +++ b/_server_information_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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
+ +
+ + + + diff --git a/_server_service_8cs.html b/_server_service_8cs.html new file mode 100644 index 0000000000..55c77418b8 --- /dev/null +++ b/_server_service_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Service
 
+
+ + + + diff --git a/_server_service_8cs_source.html b/_server_service_8cs_source.html new file mode 100644 index 0000000000..cfee5334e1 --- /dev/null +++ b/_server_service_8cs_source.html @@ -0,0 +1,124 @@ + + + + + + +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 Microsoft.Extensions.Logging.EventLog.Internal;
4 using System;
5 using System.Diagnostics;
6 using System.Diagnostics.CodeAnalysis;
7 using System.Globalization;
8 using System.ServiceProcess;
9 using System.Threading;
10 using System.Threading.Tasks;
12 
13 namespace Tgstation.Server.Host.Service
14 {
19  {
23  public const string Name = "tgstation-server-4";
24 
28  readonly IWatchdog watchdog;
29 
34 
38  CancellationTokenSource cancellationTokenSource;
39 
46  public ServerService(IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel)
47  {
48  if (watchdogFactory == null)
49  throw new ArgumentNullException(nameof(watchdogFactory));
50  if (loggerFactory == null)
51  throw new ArgumentNullException(nameof(loggerFactory));
52 
53  loggerFactory.AddEventLog(new EventLogSettings
54  {
55  EventLog = this,
56  Filter = (message, logLevel) => logLevel >= minumumLogLevel
57  });
58 
59  ServiceName = Name;
60  watchdog = watchdogFactory.CreateWatchdog(loggerFactory);
61  }
62 
64  public int MaxMessageSize => (int)EventLog.MaximumKilobytes * 1024;
65 
67  public void WriteEntry(string message, EventLogEntryType type, int eventID, short category) => EventLog.WriteEntry(message, type, eventID, category);
68 
75  async Task RunWatchdog(string[] args, CancellationToken cancellationToken)
76  {
77  await watchdog.RunAsync(false, args, cancellationTokenSource.Token).ConfigureAwait(false);
78 
79  void StopServiceAsync()
80  {
81  try
82  {
83  Task.Run(Stop, cancellationToken);
84  }
85  catch (OperationCanceledException) { }
86  catch (Exception e)
87  {
88  EventLog.WriteEntry(String.Format(CultureInfo.InvariantCulture, "Error stopping service! Exception: {0}", e));
89  }
90  }
91  StopServiceAsync();
92  }
93 
95  [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "cancellationTokenSource")]
96  protected override void Dispose(bool disposing)
97  {
98  cancellationTokenSource?.Dispose();
99  base.Dispose(disposing);
100  }
101 
103  protected override void OnStart(string[] args)
104  {
105  cancellationTokenSource?.Dispose();
106  cancellationTokenSource = new CancellationTokenSource();
107  watchdogTask = RunWatchdog(args, cancellationTokenSource.Token);
108  }
109 
111  protected override void OnStop()
112  {
113  cancellationTokenSource.Cancel();
114  watchdogTask.GetAwaiter().GetResult();
115  }
116  }
117 }
+
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
+ + +
The watchdog for a Host
Definition: IWatchdog.cs:9
+ +
readonly IWatchdog watchdog
The IWatchdog for the ServerService
+
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..c2aadd2546 --- /dev/null +++ b/_server_side_modifications_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..0ff960c596 --- /dev/null +++ b/_server_side_modifications_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Components.StaticFiles
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 }
+
ServerSideModifications(string headIncludeLine, string tailIncludeLine, bool totalDmeOverwrite)
Construct ServerSideModifications
+ + +
+ + + + diff --git a/_service_2_program_8cs.html b/_service_2_program_8cs.html new file mode 100644 index 0000000000..a69d30d6d9 --- /dev/null +++ b/_service_2_program_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Service
 
+
+ + + + diff --git a/_service_2_program_8cs_source.html b/_service_2_program_8cs_source.html new file mode 100644 index 0000000000..12e8de11ff --- /dev/null +++ b/_service_2_program_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
16 namespace Tgstation.Server.Host.Service
17 {
21  sealed class Program
22  {
26  [Option(ShortName = "u")]
27  public bool Uninstall { get; }
28 
32  [Option(ShortName = "i")]
33  public bool Install { get; set; }
34 
38  [Option(ShortName = "c")]
39  public bool Configure { get; set; }
40 
44  [Option(ShortName = "t")]
45  public bool Trace { get; set; }
46 
50  [Option(ShortName = "d")]
51  public bool Debug { get; set; }
52 
53  static readonly IWatchdogFactory watchdogFactory = new WatchdogFactory();
54 
59  static bool IsAdministrator()
60  {
61  var user = WindowsIdentity.GetCurrent();
62  var principal = new WindowsPrincipal(user);
63  return principal.IsInRole(WindowsBuiltInRole.Administrator);
64  }
65 
69  public async Task OnExecuteAsync()
70  {
71  if (Environment.UserInteractive)
72  {
73  if (!Install && !Uninstall && !Configure)
74  {
75  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);
76  if (result != DialogResult.Yes)
77  return;
78  Install = true;
79  Configure = true;
80  }
81 
82  if (!IsAdministrator())
83  {
84  //try to restart as admin
85  //its windows, first arg is .exe name guaranteed
86  var exe = Environment.GetCommandLineArgs().First();
87  var startInfo = new ProcessStartInfo
88  {
89  UseShellExecute = true,
90  Verb = "runas",
91  Arguments = String.Format(CultureInfo.InvariantCulture, "{0} {1}", Install ? "-i" : Uninstall ? "-u" : String.Empty, Configure ? "-c" : String.Empty),
92  FileName = exe,
93  WorkingDirectory = Environment.CurrentDirectory,
94  };
95  using (Process.Start(startInfo))
96  return;
97  }
98  }
99 
100  using (var loggerFactory = new LoggerFactory())
101  {
102  if (Configure)
103  await watchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty<string>(), default).ConfigureAwait(false);
104 
105  if (Install)
106  {
107  if (Uninstall)
108  //oh no, it's retarded...
109  return;
110  using (var processInstaller = new ServiceProcessInstaller())
111  using (var installer = new ServiceInstaller())
112  {
113  processInstaller.Account = ServiceAccount.LocalSystem;
114 
115  installer.Context = new InstallContext("tgs-4-install.log", new string[] { String.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", Assembly.GetEntryAssembly().Location) });
116  installer.Description = "/tg/station 13 server v4 running as a windows service";
117  installer.DisplayName = "/tg/station server 4";
118  installer.DelayedAutoStart = true;
119  installer.StartType = ServiceStartMode.Automatic;
120  installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" };
121  installer.ServiceName = ServerService.Name;
122  installer.Parent = processInstaller;
123 
124  var state = new ListDictionary();
125  installer.Install(state);
126  }
127  }
128  else if (Uninstall)
129  using (var installer = new ServiceInstaller())
130  {
131  installer.Context = new InstallContext("tgs-4-uninstall.log", null);
132  installer.ServiceName = ServerService.Name;
133  installer.Uninstall(null);
134  }
135  else if(!Configure)
136  ServiceBase.Run(new ServerService(watchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information));
137  }
138  }
139 
143  static Task<int> Main(string[] args) => CommandLineApplication.ExecuteAsync<Program>(args);
144  }
145 }
async Task OnExecuteAsync()
Command line handler, always runs
Definition: Program.cs:69
+
static bool IsAdministrator()
Check if the running user is a system administrator
Definition: Program.cs:59
+ + + + +
Contains the entrypoint for the application
Definition: Program.cs:21
+
const string Name
The canonical windows service name
+
Represents a IWatchdog as a ServiceBase
+ + + + + +
+ + + + diff --git a/_service_unavailable_exception_8cs.html b/_service_unavailable_exception_8cs.html new file mode 100644 index 0000000000..be69f00a80 --- /dev/null +++ b/_service_unavailable_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_service_unavailable_exception_8cs_source.html b/_service_unavailable_exception_8cs_source.html new file mode 100644 index 0000000000..9308fa3e3c --- /dev/null +++ b/_service_unavailable_exception_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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..bce362748d --- /dev/null +++ b/_session_controller_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..93eeca2195 --- /dev/null +++ b/_session_controller_8cs_source.html @@ -0,0 +1,180 @@ + + + + + + +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 
17 namespace Tgstation.Server.Host.Components.Watchdog
18 {
21  {
23  public bool IsPrimary
24  {
25  get
26  {
27  CheckDisposed();
28  return reattachInformation.IsPrimary;
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();
59  if (portClosedForReboot)
60  return null;
61  return reattachInformation.Port;
62  }
63  }
64 
67  {
68  get
69  {
70  CheckDisposed();
71  return reattachInformation.RebootState;
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;
142  ushort? nextPort;
143 
147  TaskCompletionSource<object> rebootTcs;
148 
153 
157  bool disposed;
158 
163 
167  bool released;
168 
182  public SessionController(ReattachInformation reattachInformation, IProcess process, IByondExecutableLock byondLock, IByondTopicSender byondTopicSender, IJsonTrackingContext chatJsonTrackingContext, ICommContext interopContext, IChat chat, ILogger<SessionController> logger, DreamDaemonSecurity? launchSecurityLevel, uint? startupTimeout)
183  {
184  this.chatJsonTrackingContext = chatJsonTrackingContext; //null valid
185  this.reattachInformation = reattachInformation ?? throw new ArgumentNullException(nameof(reattachInformation));
186  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
187  this.process = process ?? throw new ArgumentNullException(nameof(process));
188  this.byondLock = byondLock ?? throw new ArgumentNullException(nameof(byondLock));
189  this.interopContext = interopContext ?? throw new ArgumentNullException(nameof(interopContext));
190  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
191  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
192 
193  this.launchSecurityLevel = launchSecurityLevel;
194 
195  interopContext.RegisterHandler(this);
196 
197  portClosedForReboot = false;
198  disposed = false;
199  apiValidationStatus = ApiValidationStatus.NeverValidated;
200  released = false;
201 
202  rebootTcs = new TaskCompletionSource<object>();
203 
204  process.Lifetime.ContinueWith(x => chatJsonTrackingContext.Active = false, TaskScheduler.Current);
205 
206  async Task<LaunchResult> GetLaunchResult()
207  {
208  var startTime = DateTimeOffset.Now;
209  Task toAwait = process.Startup;
210 
211  if (startupTimeout.HasValue)
212  toAwait = Task.WhenAny(process.Startup, Task.Delay(startTime.AddSeconds(startupTimeout.Value) - startTime));
213 
214  await toAwait.ConfigureAwait(false);
215 
216  var result = new LaunchResult
217  {
218  ExitCode = process.Lifetime.IsCompleted ? (int?)await process.Lifetime.ConfigureAwait(false) : null,
219  StartupTime = process.Startup.IsCompleted ? (TimeSpan?)(DateTimeOffset.Now - startTime) : null
220  };
221  return result;
222  };
223  LaunchResult = GetLaunchResult();
224  }
225 
230 #pragma warning disable CA1821 // Remove empty Finalizers //TODO remove this when https://github.com/dotnet/roslyn-analyzers/issues/1241 is fixed
231  ~SessionController() => Dispose(false);
232 #pragma warning restore CA1821 // Remove empty Finalizers
233 
235  public void Dispose()
236  {
237  Dispose(true);
238  GC.SuppressFinalize(this);
239  }
240 
242  void Dispose(bool disposing)
243  {
244  lock (this)
245  {
246  if (disposed)
247  return;
248  if (disposing)
249  {
250  if (!released)
251  {
252  process.Terminate();
253  byondLock.Dispose();
254  }
255  process.Dispose();
256  interopContext.Dispose();
257  Dmb?.Dispose(); //will be null when released
258  chatJsonTrackingContext.Dispose();
259  disposed = true;
260  }
261  else
262  {
263  if (logger != null)
264  logger.LogError("Being disposed via finalizer!");
265  if (!released)
266  if (process != null)
267  process.Terminate();
268  else if (logger != null)
269  logger.LogCritical("Unable to terminate active DreamDaemon session due to finalizer ordering!");
270  }
271  }
272  }
273 
275  public async Task HandleInterop(CommCommand command, CancellationToken cancellationToken)
276  {
277  if (command == null)
278  throw new ArgumentNullException(nameof(command));
279 
280  var query = command.Parameters;
281 
282  object content;
283  Action postRespond = null;
284  ushort? overrideResponsePort = null;
285  if (query.TryGetValue(Constants.DMParameterCommand, out var method))
286  {
287  content = new object();
288  switch (method)
289  {
291  try
292  {
293  var message = JsonConvert.DeserializeObject<Response>(command.RawJson, new JsonSerializerSettings
294  {
295  ContractResolver = new CamelCasePropertyNamesContractResolver()
296  });
297  if (message.ChannelIds == null)
298  throw new InvalidOperationException("Missing ChannelIds field!");
299  if (message.Message == null)
300  throw new InvalidOperationException("Missing Message field!");
301  await chat.SendMessage(message.Message, message.ChannelIds, cancellationToken).ConfigureAwait(false);
302  }
303  catch (Exception e)
304  {
305  logger.LogDebug("Exception while decoding chat message! Exception: {0}", e);
306  goto default;
307  }
308  break;
310  //currently unused, maybe in the future
311  break;
313  TerminationWasRequested = true;
314  process.Terminate();
315  return;
317  lock (this)
318  {
319  if (!query.TryGetValue(Constants.DMParameterData, out var stringPort) || !UInt16.TryParse(stringPort, out var currentPort))
320  {
322  logger.LogWarning("DreamDaemon sent new port command without providing it's own!");
323  content = new ErrorMessage { Message = "Missing stringified port as data parameter!" };
324  break;
325  }
326 
327  if (!nextPort.HasValue)
328  //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
329  reattachInformation.Port = currentPort;
330  else
331  {
332  //nextPort is ready, tell DD to switch to that
333  //if it fails it'll kill itself
334  content = new Dictionary<string, ushort> { { Constants.DMParameterData, nextPort.Value } };
335  reattachInformation.Port = nextPort.Value;
336  overrideResponsePort = currentPort;
337  nextPort = null;
338 
339  //we'll also get here from SetPort so complete that task
340  var tmpTcs = portAssignmentTcs;
341  portAssignmentTcs = null;
342  if (tmpTcs != null)
343  postRespond = () => tmpTcs.SetResult(true);
344  }
345 
346  portClosedForReboot = false;
347  }
348  break;
350  if (!launchSecurityLevel.HasValue)
351  {
352  logger.LogWarning("DreamDaemon requested API validation but no intial security level was passed to the session controller!");
353  apiValidationStatus = ApiValidationStatus.UnaskedValidationRequest;
354  content = new ErrorMessage { Message = "Invalid API validation request!" };
355  break;
356  }
357  if (!query.TryGetValue(Constants.DMParameterData, out var stringMinimumSecurityLevel) || !Enum.TryParse<DreamDaemonSecurity>(stringMinimumSecurityLevel, out var minimumSecurityLevel))
358  apiValidationStatus = ApiValidationStatus.BadValidationRequest;
359  else
360  switch (minimumSecurityLevel)
361  {
362  case DreamDaemonSecurity.Safe:
363  apiValidationStatus = ApiValidationStatus.RequiresSafe;
364  break;
365  case DreamDaemonSecurity.Ultrasafe:
366  apiValidationStatus = ApiValidationStatus.RequiresUltrasafe;
367  break;
368  case DreamDaemonSecurity.Trusted:
369  apiValidationStatus = ApiValidationStatus.RequiresTrusted;
370  break;
371  default:
372  throw new InvalidOperationException("Enum.TryParse failed to validate the DreamDaemonSecurity range!");
373  }
374  break;
376  if (ClosePortOnReboot)
377  {
378  chatJsonTrackingContext.Active = false;
379  content = new Dictionary<string, int> { { Constants.DMParameterData, 0 } };
380  portClosedForReboot = true;
381  }
382  var oldTcs = rebootTcs;
383  rebootTcs = new TaskCompletionSource<object>();
384  postRespond = () => oldTcs.SetResult(null);
385  break;
386  default:
387  content = new ErrorMessage { Message = "Requested command not supported!" };
388  break;
389  }
390  }
391  else
392  content = new ErrorMessage { Message = "Missing command parameter!" };
393 
394  var json = JsonConvert.SerializeObject(content);
395  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);
396 
397  if (response != Constants.DMResponseSuccess)
398  logger.LogWarning("Received error response while responding to interop: {0}", response);
399 
400  postRespond?.Invoke();
401  }
402 
407  {
408  if (disposed)
409  throw new ObjectDisposedException(nameof(SessionController));
410  }
411 
413  public void EnableCustomChatCommands() => chatJsonTrackingContext.Active = true;
414 
417  {
418  CheckDisposed();
419  //we still don't want to dispose the dmb yet, even though we're keeping it alive
420  var tmpProvider = reattachInformation.Dmb;
421  reattachInformation.Dmb = null;
422  released = true;
423  Dispose();
424  byondLock.DoNotDeleteThisSession();
425  tmpProvider.KeepAlive();
426  reattachInformation.Dmb = tmpProvider;
427  return reattachInformation;
428  }
429 
431  public Task<string> SendCommand(string command, CancellationToken cancellationToken) => SendCommand(command, null, cancellationToken);
432 
433  async Task<string> SendCommand(string command, ushort? overridePort, CancellationToken cancellationToken)
434  {
435  try
436  {
437  var commandString = String.Format(CultureInfo.InvariantCulture,
438  "?{0}={1}&{2}={3}",
439  byondTopicSender.SanitizeString(Constants.DMInteropAccessIdentifier),
440  byondTopicSender.SanitizeString(reattachInformation.AccessIdentifier),
441  byondTopicSender.SanitizeString(Constants.DMParameterCommand),
442  //intentionally don't sanitize command, that's up to the caller
443  command);
444 
445  var targetPort = overridePort ?? reattachInformation.Port;
446  logger.LogTrace("Export to :{0}. Query: {1}", targetPort, commandString);
447 
448  return await byondTopicSender.SendTopic(
449  new IPEndPoint(IPAddress.Loopback, targetPort),
450  commandString,
451  cancellationToken).ConfigureAwait(false);
452  }
453  catch (OperationCanceledException)
454  {
455  throw;
456  }
457  catch (Exception e)
458  {
459  logger.LogInformation("Send command exception:{0}{1}", Environment.NewLine, e.Message);
460  return null;
461  }
462  }
463 
465  public Task<bool> SetPort(ushort port, CancellationToken cancellationToken)
466  {
467  CheckDisposed();
468 
469  if (port == 0)
470  throw new ArgumentOutOfRangeException(nameof(port), port, "port must not be zero!");
471 
472  async Task<bool> ImmediateTopicPortChange()
473  {
474  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);
475 
476  if (commandResult != Constants.DMResponseSuccess)
477  {
478  logger.LogWarning("Failed port change! DD says: {0}", commandResult);
479  return false;
480  }
481 
482  return true;
483  }
484 
485  lock (this)
486  if (portClosedForReboot)
487  {
488  if (portAssignmentTcs != null)
489  throw new InvalidOperationException("A port change operation is already in progress!");
490  nextPort = port;
491  portAssignmentTcs = new TaskCompletionSource<bool>();
492  return portAssignmentTcs.Task;
493  }
494  else
495  return ImmediateTopicPortChange();
496  }
497 
499  public async Task<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)
500  {
501  if (RebootState == newRebootState)
502  return true;
503  reattachInformation.RebootState = newRebootState;
504  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;
505  }
506 
508  public void ResetRebootState()
509  {
510  CheckDisposed();
511  reattachInformation.RebootState = RebootState.Normal;
512  }
513 
515  public void SetHighPriority() => process.SetHighPriority();
516  }
517 }
+
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
+
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
+ +
IReadOnlyDictionary< string, string > Parameters
The dictionary of the CommCommand
Definition: CommCommand.cs:13
+ + +
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
+ + +
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
+
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
+
Handles communication with a DreamDaemon IProcess
+
string RawJson
The raw JSON of the CommCommand
Definition: CommCommand.cs:18
+
readonly DreamDaemonSecurity launchSecurityLevel
The DreamDaemonSecurity level the process was launched with
+ +
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
+ +
async Task< string > SendCommand(string command, ushort?overridePort, CancellationToken cancellationToken)
+ + +
ushort nextPort
The port to assign DreamDaemon when it queries for it
+ +
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+
TaskCompletionSource< object > rebootTcs
The TaskCompletionSource<TResult> that completes when DD tells us about a reboot
+ +
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
Represents a tracking of dynamic chat json files
+ + + + +
Represents usage of the two primary BYOND server executables
+ +
ApiValidationStatus apiValidationStatus
The ApiValidationStatus for the SessionController
+ + +
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI ...
+
Represents a BYOND installation
Definition: Byond.cs:8
+ + +
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
bool portClosedForReboot
If we know DreamDaemon currently has it&#39;s port closed
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+ +
async Task HandleInterop(CommCommand command, CancellationToken cancellationToken)
Handle a command
+ +
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
+
Parameters necessary for duplicating a ISessionController session
+ +
ApiValidationStatus
Status of DMAPI validation
+
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..a6c91d5512 --- /dev/null +++ b/_session_controller_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..53b974a8ad --- /dev/null +++ b/_session_controller_factory_8cs_source.html @@ -0,0 +1,179 @@ + + + + + + +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.Runtime.InteropServices;
9 using System.Text;
10 using System.Threading;
11 using System.Threading.Tasks;
18 using Tgstation.Server.Host.IO;
20 
21 namespace Tgstation.Server.Host.Components.Watchdog
22 {
25  {
30 
34  readonly IByondManager byond;
35 
39  readonly IByondTopicSender byondTopicSender;
40 
45 
50 
55 
59  readonly IChat chat;
60 
65 
70 
74  readonly ILoggerFactory loggerFactory;
75 
79  readonly Api.Models.Instance instance;
80 
86  static string SecurityWord(DreamDaemonSecurity securityLevel)
87  {
88  switch (securityLevel)
89  {
90  case DreamDaemonSecurity.Safe:
91  return "safe";
92  case DreamDaemonSecurity.Trusted:
93  return "trusted";
94  case DreamDaemonSecurity.Ultrasafe:
95  return "ultrasafe";
96  default:
97  throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel));
98  }
99  }
100 
115  public 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)
116  {
117  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
118  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
119  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
120  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
121  this.application = application ?? throw new ArgumentNullException(nameof(application));
122  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
123  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
124  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
125  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
126  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
127  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
128  }
129 
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  //delete all previous tgs json files
142  var files = await ioManager.GetFilesWithExtension(basePath, JsonPostfix, cancellationToken).ConfigureAwait(false);
143 
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 localIoManager = new ResolvingIOManager(ioManager, basePath);
193 
194  var chatJsonTrackingTask = chat.TrackJsons(basePath, interopInfo.ChatChannelsJson, interopInfo.ChatCommandsJson, cancellationToken);
195 
196  await localIoManager.WriteAllBytes(interopJsonFile, Encoding.UTF8.GetBytes(interopJson), cancellationToken).ConfigureAwait(false);
197  var chatJsonTrackingContext = await chatJsonTrackingTask.ConfigureAwait(false);
198  try
199  {
200  //get the byond lock
201  var byondLock = currentByondLock ?? await byond.UseExecutables(Version.Parse(dmbProvider.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
202  try
203  {
204  //create interop context
205  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, interopInfo.ServerCommandsJson);
206  try
207  {
208  //set command line options
209  //more sanitization here cause it uses the same scheme
210  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));
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} -verbose -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 
220  //See #719
221  var noShellExecute = !platformIdentifier.IsWindows;
222  //launch dd
223  var process = processExecutor.LaunchProcess(byondLock.DreamDaemonPath, basePath, arguments, noShellExecute: noShellExecute);
224  try
225  {
226  networkPromptReaper.RegisterProcess(process);
227 
228  //return the session controller for it
229  var result = new SessionController(new ReattachInformation
230  {
231  AccessIdentifier = accessIdentifier,
232  Dmb = dmbProvider,
233  IsPrimary = primaryDirectory,
234  Port = portToUse.Value,
235  ProcessId = process.Id,
236  ChatChannelsJson = interopInfo.ChatChannelsJson,
237  ChatCommandsJson = interopInfo.ChatCommandsJson,
238  ServerCommandsJson = interopInfo.ServerCommandsJson,
239  }, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), launchParameters.SecurityLevel, launchParameters.StartupTimeout);
240 
241  //writeback launch parameter's fixed security level
242  launchParameters.SecurityLevel = securityLevelToUse;
243 
244  return result;
245  }
246  catch
247  {
248  process.Dispose();
249  throw;
250  }
251  }
252  catch
253  {
254  context.Dispose();
255  throw;
256  }
257  }
258  catch
259  {
260  if (currentByondLock == null)
261  byondLock.Dispose();
262  throw;
263  }
264  }
265  catch
266  {
267  chatJsonTrackingContext.Dispose();
268  throw;
269  }
270  }
271 
273  public async Task<ISessionController> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
274  {
275  if (reattachInformation == null)
276  throw new ArgumentNullException(nameof(reattachInformation));
277 
278  SessionController result = null;
279  var basePath = reattachInformation.IsPrimary ? reattachInformation.Dmb.PrimaryDirectory : reattachInformation.Dmb.SecondaryDirectory;
280  var chatJsonTrackingContext = await chat.TrackJsons(basePath, reattachInformation.ChatChannelsJson, reattachInformation.ChatCommandsJson, cancellationToken).ConfigureAwait(false);
281  try
282  {
283  var byondLock = await byond.UseExecutables(Version.Parse(reattachInformation.Dmb.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
284  try
285  {
286  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, reattachInformation.ServerCommandsJson);
287  try
288  {
289  var process = processExecutor.GetProcess(reattachInformation.ProcessId);
290 
291  if (process != null)
292  try
293  {
294  networkPromptReaper.RegisterProcess(process);
295  result = new SessionController(reattachInformation, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), null, null);
296  }
297  finally
298  {
299  if (result == null)
300  process.Dispose();
301  }
302  }
303  finally
304  {
305  if (result == null)
306  context.Dispose();
307  }
308  }
309  finally
310  {
311  if (result == null)
312  byondLock.Dispose();
313  }
314  }
315  finally
316  {
317  if (result == null)
318  chatJsonTrackingContext.Dispose();
319  }
320  return result;
321  }
322 
324  public ISessionController CreateDeadSession(IDmbProvider dmbProvider) => new DeadSessionController(dmbProvider);
325  }
326 }
string ServerCommandsJson
Path to the server commands json file
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the SessionControllerFactory
+ +
readonly IIOManager ioManager
The IIOManager for the SessionControllerFactory
+ +
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
+
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that ...
+ +
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
+ +
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+ +
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
+
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
+
DreamDaemonSecurity MinimumSecurityLevel
The minimum DreamDaemonSecurity required to run the CompileJob&#39;s output
Definition: CompileJob.cs:38
+
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
+
async Task< ISessionController > Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance
+
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+ + +
For managing the BYOND installation
+
bool IsPrimary
If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used ...
+ + +
string ChatChannelsJson
Path to the chat channels json file
+ +
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
+ +
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
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
+
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
+
For identifying the current platform
+
static string SecurityWord(DreamDaemonSecurity securityLevel)
Change a given securityLevel into the appropriate DreamDaemon command line word
+ + +
string OriginCommitSha
The sha of the most recent remote commit
+
ushort PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
Parameters necessary for duplicating a ISessionController session
+ + + + +
bool AllowWebClient
If the BYOND web client can be used to connect to the game server
+
+ + + + diff --git a/_setup_wizard_8cs.html b/_setup_wizard_8cs.html new file mode 100644 index 0000000000..3927f59fae --- /dev/null +++ b/_setup_wizard_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Host.Core
 
+
+ + + + diff --git a/_setup_wizard_8cs_source.html b/_setup_wizard_8cs_source.html new file mode 100644 index 0000000000..d23c4c6b46 --- /dev/null +++ b/_setup_wizard_8cs_source.html @@ -0,0 +1,148 @@ + + + + + + +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.Runtime.InteropServices;
12 using System.Text;
13 using System.Threading;
14 using System.Threading.Tasks;
16 using Tgstation.Server.Host.IO;
17 
18 namespace Tgstation.Server.Host.Core
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  await console.WriteAsync("Invalid database type!", true, cancellationToken).ConfigureAwait(false);
162  }
163  while (true);
164 
165  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
166  await console.WriteAsync("Enter the server's address and port (blank for local): ", false, cancellationToken).ConfigureAwait(false);
167  var serverAddress = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
168  if (String.IsNullOrWhiteSpace(serverAddress))
169  serverAddress = null;
170 
171  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
172  await console.WriteAsync("Enter the database name (Can be from previous installation. Otherwise, should not exist): ", false, cancellationToken).ConfigureAwait(false);
173  string databaseName;
174 
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  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
210 
211  DbConnection testConnection;
212  void CreateTestConnection(string connectionString)
213  {
214  testConnection = dbConnectionFactory.CreateConnection(connectionString, databaseConfiguration.DatabaseType);
215  }
216 
217  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
218  {
219  var csb = new SqlConnectionStringBuilder
220  {
221  ApplicationName = application.VersionPrefix,
222  DataSource = serverAddress ?? "(local)"
223  };
224  if (useWinAuth)
225  csb.IntegratedSecurity = true;
226  else
227  {
228  csb.UserID = username;
229  csb.Password = password;
230  }
231 
232  CreateTestConnection(csb.ConnectionString);
233  csb.InitialCatalog = databaseName;
234  databaseConfiguration.ConnectionString = csb.ConnectionString;
235  }
236  else
237  {
238  var csb = new MySqlConnectionStringBuilder
239  {
240  Server = serverAddress ?? "127.0.0.1",
241  UserID = username,
242  Password = password
243  };
244 
245  CreateTestConnection(csb.ConnectionString);
246  csb.Database = databaseName;
247  databaseConfiguration.ConnectionString = csb.ConnectionString;
248  }
249 
250  try
251  {
252  using (testConnection)
253  {
254  await console.WriteAsync("Testing connection...", true, cancellationToken).ConfigureAwait(false);
255  await testConnection.OpenAsync(cancellationToken).ConfigureAwait(false);
256  await console.WriteAsync("Connection successful!", true, cancellationToken).ConfigureAwait(false);
257 
258  if (databaseConfiguration.DatabaseType != DatabaseType.SqlServer)
259  {
260  await console.WriteAsync("Checking MySQL/MariaDB version...", true, cancellationToken).ConfigureAwait(false);
261  using (var command = testConnection.CreateCommand())
262  {
263  command.CommandText = "SELECT VERSION()";
264  var fullVersion = (string)(await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false));
265  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Found {0}", fullVersion), true, cancellationToken).ConfigureAwait(false);
266  var splits = fullVersion.Split('-');
267  databaseConfiguration.MySqlServerVersion = splits[0];
268  }
269  }
270 
271  if (!dbExists)
272  {
273  await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false);
274  using (var command = testConnection.CreateCommand())
275  {
276  command.CommandText = String.Format(CultureInfo.InvariantCulture, "CREATE DATABASE {0}", databaseName);
277  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
278  }
279  await console.WriteAsync("Success!", true, cancellationToken).ConfigureAwait(false);
280  await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false);
281  using (var command = testConnection.CreateCommand())
282  {
283  command.CommandText = String.Format(CultureInfo.InvariantCulture, "DROP DATABASE {0}", databaseName);
284  try
285  {
286  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
287  }
288  catch (OperationCanceledException)
289  {
290  throw;
291  }
292  catch (Exception e)
293  {
294  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
295  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
296  await console.WriteAsync("This should be okay, but you may want to manually drop the database before continuing!", true, cancellationToken).ConfigureAwait(false);
297  await console.WriteAsync("Press any key to continue...", true, cancellationToken).ConfigureAwait(false);
298  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
299  }
300  }
301  }
302  }
303 
304  return databaseConfiguration;
305  }
306  catch (OperationCanceledException)
307  {
308  throw;
309  }
310  catch (Exception e)
311  {
312  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
313  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
314  await console.WriteAsync("Retrying database configuration...", true, cancellationToken).ConfigureAwait(false);
315  }
316  } while (true);
317  }
318 
324  async Task<GeneralConfiguration> ConfigureGeneral(CancellationToken cancellationToken)
325  {
326  var newGeneralConfiguration = new GeneralConfiguration
327  {
329  };
330  do
331  {
332  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
333  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Minimum database user password length (leave blank for default of {0}): ", newGeneralConfiguration.MinimumPasswordLength), false, cancellationToken).ConfigureAwait(false);
334  var passwordLengthString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
335  if (String.IsNullOrWhiteSpace(passwordLengthString))
336  break;
337  if (UInt32.TryParse(passwordLengthString, out var passwordLength) && passwordLength >= 0)
338  {
339  newGeneralConfiguration.MinimumPasswordLength = passwordLength;
340  break;
341  }
342  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
343  }
344  while (true);
345 
346  do
347  {
348  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
349  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);
350  var topicTimeoutString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
351  if (String.IsNullOrWhiteSpace(topicTimeoutString))
352  break;
353  if (Int32.TryParse(topicTimeoutString, out var topicTimeout) && topicTimeout >= 0)
354  {
355  newGeneralConfiguration.ByondTopicTimeout = topicTimeout;
356  break;
357  }
358  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
359  }
360  while (true);
361 
362  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
363  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);
364  await console.WriteAsync("GitHub personal access token: ", false, cancellationToken).ConfigureAwait(false);
365  newGeneralConfiguration.GitHubAccessToken = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
366  if (String.IsNullOrWhiteSpace(newGeneralConfiguration.GitHubAccessToken))
367  newGeneralConfiguration.GitHubAccessToken = null;
368  return newGeneralConfiguration;
369  }
370 
376  async Task<FileLoggingConfiguration> ConfigureLogging(CancellationToken cancellationToken)
377  {
378  var fileLoggingConfiguration = new FileLoggingConfiguration();
379  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
380  fileLoggingConfiguration.Disable = !await PromptYesNo("Enable file logging? (y/n): ", cancellationToken).ConfigureAwait(false);
381 
382  if (!fileLoggingConfiguration.Disable)
383  {
384  do
385  {
386  await console.WriteAsync("Log file directory path (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
387  fileLoggingConfiguration.Directory = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
388  if (String.IsNullOrWhiteSpace(fileLoggingConfiguration.Directory))
389  {
390  fileLoggingConfiguration.Directory = null;
391  break;
392  }
393  //test a write of it
394  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
395  await console.WriteAsync("Testing directory access...", true, cancellationToken).ConfigureAwait(false);
396  try
397  {
398  await ioManager.CreateDirectory(fileLoggingConfiguration.Directory, cancellationToken).ConfigureAwait(false);
399  var testFile = ioManager.ConcatPath(fileLoggingConfiguration.Directory, String.Format(CultureInfo.InvariantCulture, "WizardAccesTest.{0}.deleteme", Guid.NewGuid()));
400  await ioManager.WriteAllBytes(testFile, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
401  try
402  {
403  await ioManager.DeleteFile(testFile, cancellationToken).ConfigureAwait(false);
404  }
405  catch (OperationCanceledException)
406  {
407  throw;
408  }
409  catch (Exception e)
410  {
411  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Error deleting test log file: {0}", testFile), true, cancellationToken).ConfigureAwait(false);
412  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
413  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
414  }
415  break;
416  }
417  catch (OperationCanceledException)
418  {
419  throw;
420  }
421  catch (Exception e)
422  {
423  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
424  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
425  await console.WriteAsync("Please verify the path is valid and you have access to it!", true, cancellationToken).ConfigureAwait(false);
426  }
427  } while (true);
428 
429  async Task<LogLevel?> PromptLogLevel(string question)
430  {
431  do
432  {
433  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
434  await console.WriteAsync(question, true, cancellationToken).ConfigureAwait(false);
435  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);
436  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
437  if (String.IsNullOrWhiteSpace(responseString))
438  return null;
439  if (Enum.TryParse<LogLevel>(responseString, out var logLevel) && logLevel != LogLevel.None)
440  return logLevel;
441  await console.WriteAsync("Invalid log level!", true, cancellationToken).ConfigureAwait(false);
442  } while (true);
443  }
444 
445  fileLoggingConfiguration.LogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for normal logs (default {0}).", fileLoggingConfiguration.LogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.LogLevel;
446  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;
447  }
448  return fileLoggingConfiguration;
449  }
450 
461  async Task SaveConfiguration(string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, CancellationToken cancellationToken)
462  {
463  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Configuration complete! Saving to {0}", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
464 
465  var map = new Dictionary<string, object>()
466  {
467  { DatabaseConfiguration.Section, databaseConfiguration },
468  { GeneralConfiguration.Section, newGeneralConfiguration },
469  { FileLoggingConfiguration.Section, fileLoggingConfiguration }
470  };
471 
472  if (hostingPort.HasValue)
473  map.Add("Kestrel", new
474  {
475  EndPoints = new
476  {
477  Http = new
478  {
479  Url = String.Format(CultureInfo.InvariantCulture, "http://0.0.0.0:{0}", hostingPort)
480  }
481  }
482  });
483 
484  var json = JsonConvert.SerializeObject(map, Formatting.Indented);
485  var configBytes = Encoding.UTF8.GetBytes(json);
486 
487  try
488  {
489  await ioManager.WriteAllBytes(userConfigFileName, configBytes, cancellationToken).ConfigureAwait(false);
490  }
491  catch (OperationCanceledException)
492  {
493  throw;
494  }
495  catch (Exception e)
496  {
497  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
498  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
499  await console.WriteAsync("For your convienence, here's the json we tried to write out:", true, cancellationToken).ConfigureAwait(false);
500  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
501  await console.WriteAsync(json, true, cancellationToken).ConfigureAwait(false);
502  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
503  await console.WriteAsync("Press any key to exit...", true, cancellationToken).ConfigureAwait(false);
504  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
505  throw new OperationCanceledException();
506  }
507 
508  await console.WriteAsync("Waiting for configuration changes to reload...", true, cancellationToken).ConfigureAwait(false);
509 
510  //we need to wait for the configuration's file system watcher to read and reload the changes
511  await asyncDelayer.Delay(TimeSpan.FromSeconds(5), cancellationToken).ConfigureAwait(false);
512  }
513 
520  async Task RunWizard(string userConfigFileName, CancellationToken cancellationToken)
521  {
522  //welcome message
523  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
524  await console.WriteAsync("Welcome to tgstation-server 4!", true, cancellationToken).ConfigureAwait(false);
525  await console.WriteAsync("This wizard will help you configure your server.", true, cancellationToken).ConfigureAwait(false);
526 
527  var hostingPort = await PromptForHostingPort(cancellationToken).ConfigureAwait(false);
528 
529  var databaseConfiguration = await ConfigureDatabase(cancellationToken).ConfigureAwait(false);
530 
531  var newGeneralConfiguration = await ConfigureGeneral(cancellationToken).ConfigureAwait(false);
532 
533  var fileLoggingConfiguration = await ConfigureLogging(cancellationToken).ConfigureAwait(false);
534 
535  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
536 
537  await SaveConfiguration(userConfigFileName, hostingPort, databaseConfiguration, newGeneralConfiguration, fileLoggingConfiguration, cancellationToken).ConfigureAwait(false);
538  }
539 
541  public async Task<bool> CheckRunWizard(CancellationToken cancellationToken)
542  {
543  var setupWizardMode = generalConfiguration.SetupWizardMode;
544  logger.LogTrace("Checking if setup wizard should run. SetupWizardMode: {0}", setupWizardMode);
545 
546  if (setupWizardMode == SetupWizardMode.Never)
547  {
548  logger.LogTrace("Skipping due to configuration...");
549  return false;
550  }
551 
552  var forceRun = setupWizardMode == SetupWizardMode.Force || setupWizardMode == SetupWizardMode.Only;
553  if (!console.Available)
554  {
555  if (forceRun)
556  throw new InvalidOperationException("Asked to run setup wizard with no console avaliable!");
557  logger.LogTrace("Skipping due to console not being available...");
558  return false;
559  }
560 
561  var userConfigFileName = String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.json", hostingEnvironment.EnvironmentName);
562  var exists = await ioManager.FileExists(userConfigFileName, cancellationToken).ConfigureAwait(false);
563 
564  bool shouldRunBasedOnAutodetect;
565  if (exists)
566  {
567  var bytes = await ioManager.ReadAllBytes(userConfigFileName, cancellationToken).ConfigureAwait(false);
568  var contents = Encoding.UTF8.GetString(bytes);
569  var existingConfigIsEmpty = String.IsNullOrWhiteSpace(contents);
570  logger.LogTrace("Configuration json detected. Empty: {0}", existingConfigIsEmpty);
571  shouldRunBasedOnAutodetect = existingConfigIsEmpty;
572  }
573  else
574  {
575  shouldRunBasedOnAutodetect = true;
576  logger.LogTrace("No configuration json detected");
577  }
578 
579 
580  if (!shouldRunBasedOnAutodetect)
581  {
582  if (forceRun)
583  {
584  logger.LogTrace("Asking user to bypass due to force run request...");
585  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);
586 
587  forceRun = await PromptYesNo("Continue running setup wizard? (y/n): ", cancellationToken).ConfigureAwait(false);
588  }
589  if (!forceRun)
590  return false;
591  }
592 
593  //flush the logs to prevent console conflicts
594  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
595 
596  await RunWizard(userConfigFileName, cancellationToken).ConfigureAwait(false);
597  return true;
598  }
599  }
600 }
+
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
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
+ + +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+
readonly IApplication application
The IApplication for the SetupWizard
Definition: SetupWizard.cs:41
+ +
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
+
async Task< bool > PromptYesNo(string question, CancellationToken cancellationToken)
A prompt for a yes or no value
Definition: SetupWizard.cs:99
+ +
async Task< DatabaseConfiguration > ConfigureDatabase(CancellationToken cancellationToken)
Prompts the user to create a DatabaseConfiguration
Definition: SetupWizard.cs:144
+ +
async Task SaveConfiguration(string userConfigFileName, ushort?hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, CancellationToken cancellationToken)
Saves a given Configuration set to userConfigFileName
Definition: SetupWizard.cs:461
+
async Task< GeneralConfiguration > ConfigureGeneral(CancellationToken cancellationToken)
Prompts the user to create a GeneralConfiguration
Definition: SetupWizard.cs:324
+ +
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:376
+ +
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:541
+
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
+
async Task RunWizard(string userConfigFileName, CancellationToken cancellationToken)
Runs the SetupWizard
Definition: SetupWizard.cs:520
+ +
uint MinimumPasswordLength
Minimum length of database user passwords
+ + +
+ + + + diff --git a/_setup_wizard_mode_8cs.html b/_setup_wizard_mode_8cs.html new file mode 100644 index 0000000000..3ed6e1ae18 --- /dev/null +++ b/_setup_wizard_mode_8cs.html @@ -0,0 +1,124 @@ + + + + + + +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..7d45aa87aa --- /dev/null +++ b/_setup_wizard_mode_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Configuration
2 {
6  public enum SetupWizardMode
7  {
11  Autodetect,
15  Force,
19  Only,
23  Never
24  }
25 }
+ +
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..01ffefa67e --- /dev/null +++ b/_sql_server_database_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SqlServerDatabaseContext.cs File Reference
+
+ + + + + diff --git a/_sql_server_database_context_8cs_source.html b/_sql_server_database_context_8cs_source.html new file mode 100644 index 0000000000..b65d0d2a55 --- /dev/null +++ b/_sql_server_database_context_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Models
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  }
30 }
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>
+ + + +
+ + + + 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..502a2c7714 --- /dev/null +++ b/_sql_server_database_context_model_snapshot_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..41d490a592 --- /dev/null +++ b/_sql_server_database_context_model_snapshot_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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;
8 
9 namespace Tgstation.Server.Host.Models.Migrations
10 {
13  {
14  protected override void BuildModel(ModelBuilder modelBuilder)
15  {
16 #pragma warning disable 612, 618
17  modelBuilder
18  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
19  .HasAnnotation("Relational:MaxIdentifierLength", 128)
20  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
21 
22  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
23  {
24  b.Property<long>("Id")
25  .ValueGeneratedOnAdd()
26  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
27 
28  b.Property<string>("ConnectionString")
29  .IsRequired();
30 
31  b.Property<bool?>("Enabled");
32 
33  b.Property<long>("InstanceId");
34 
35  b.Property<string>("Name")
36  .IsRequired();
37 
38  b.Property<int?>("Provider");
39 
40  b.HasKey("Id");
41 
42  b.HasIndex("InstanceId");
43 
44  b.HasIndex("Name")
45  .IsUnique();
46 
47  b.ToTable("ChatBots");
48  });
49 
50  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
51  {
52  b.Property<long>("Id")
53  .ValueGeneratedOnAdd()
54  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<decimal?>("DiscordChannelId")
59  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
60 
61  b.Property<string>("IrcChannel");
62 
63  b.Property<bool?>("IsAdminChannel")
64  .IsRequired();
65 
66  b.Property<bool?>("IsUpdatesChannel")
67  .IsRequired();
68 
69  b.Property<bool?>("IsWatchdogChannel")
70  .IsRequired();
71 
72  b.Property<string>("Tag");
73 
74  b.HasKey("Id");
75 
76  b.HasIndex("ChatSettingsId", "DiscordChannelId")
77  .IsUnique()
78  .HasFilter("[DiscordChannelId] IS NOT NULL");
79 
80  b.HasIndex("ChatSettingsId", "IrcChannel")
81  .IsUnique()
82  .HasFilter("[IrcChannel] IS NOT NULL");
83 
84  b.ToTable("ChatChannels");
85  });
86 
87  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
88  {
89  b.Property<long>("Id")
90  .ValueGeneratedOnAdd()
91  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
92 
93  b.Property<string>("ByondVersion")
94  .IsRequired();
95 
96  b.Property<Guid?>("DirectoryName")
97  .IsRequired();
98 
99  b.Property<string>("DmeName")
100  .IsRequired();
101 
102  b.Property<long>("JobId");
103 
104  b.Property<int>("MinimumSecurityLevel");
105 
106  b.Property<string>("Output")
107  .IsRequired();
108 
109  b.Property<long>("RevisionInformationId");
110 
111  b.HasKey("Id");
112 
113  b.HasIndex("DirectoryName");
114 
115  b.HasIndex("JobId")
116  .IsUnique();
117 
118  b.HasIndex("RevisionInformationId");
119 
120  b.ToTable("CompileJobs");
121  });
122 
123  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
124  {
125  b.Property<long>("Id")
126  .ValueGeneratedOnAdd()
127  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
128 
129  b.Property<string>("AccessToken");
130 
131  b.Property<bool?>("AllowWebClient")
132  .IsRequired();
133 
134  b.Property<bool?>("AutoStart")
135  .IsRequired();
136 
137  b.Property<long>("InstanceId");
138 
139  b.Property<int>("PrimaryPort");
140 
141  b.Property<int?>("ProcessId");
142 
143  b.Property<int>("SecondaryPort");
144 
145  b.Property<int>("SecurityLevel");
146 
147  b.Property<bool?>("SoftRestart")
148  .IsRequired();
149 
150  b.Property<bool?>("SoftShutdown")
151  .IsRequired();
152 
153  b.Property<long>("StartupTimeout");
154 
155  b.HasKey("Id");
156 
157  b.HasIndex("InstanceId")
158  .IsUnique();
159 
160  b.ToTable("DreamDaemonSettings");
161  });
162 
163  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
164  {
165  b.Property<long>("Id")
166  .ValueGeneratedOnAdd()
167  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
168 
169  b.Property<int>("ApiValidationPort");
170 
171  b.Property<int>("ApiValidationSecurityLevel");
172 
173  b.Property<long>("InstanceId");
174 
175  b.Property<string>("ProjectName");
176 
177  b.HasKey("Id");
178 
179  b.HasIndex("InstanceId")
180  .IsUnique();
181 
182  b.ToTable("DreamMakerSettings");
183  });
184 
185  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
186  {
187  b.Property<long>("Id")
188  .ValueGeneratedOnAdd()
189  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
190 
191  b.Property<long>("AutoUpdateInterval");
192 
193  b.Property<int>("ConfigurationType");
194 
195  b.Property<string>("Name")
196  .IsRequired();
197 
198  b.Property<bool?>("Online")
199  .IsRequired();
200 
201  b.Property<string>("Path")
202  .IsRequired();
203 
204  b.HasKey("Id");
205 
206  b.HasIndex("Path")
207  .IsUnique();
208 
209  b.ToTable("Instances");
210  });
211 
212  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
213  {
214  b.Property<long>("Id")
215  .ValueGeneratedOnAdd()
216  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
217 
218  b.Property<decimal>("ByondRights")
219  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
220 
221  b.Property<decimal>("ChatBotRights")
222  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
223 
224  b.Property<decimal>("ConfigurationRights")
225  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
226 
227  b.Property<decimal>("DreamDaemonRights")
228  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
229 
230  b.Property<decimal>("DreamMakerRights")
231  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
232 
233  b.Property<long>("InstanceId");
234 
235  b.Property<decimal>("InstanceUserRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<decimal>("RepositoryRights")
239  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
240 
241  b.Property<long?>("UserId")
242  .IsRequired();
243 
244  b.HasKey("Id");
245 
246  b.HasIndex("InstanceId");
247 
248  b.HasIndex("UserId", "InstanceId")
249  .IsUnique();
250 
251  b.ToTable("InstanceUsers");
252  });
253 
254  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
255  {
256  b.Property<long>("Id")
257  .ValueGeneratedOnAdd()
258  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
259 
260  b.Property<decimal?>("CancelRight")
261  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
262 
263  b.Property<decimal?>("CancelRightsType")
264  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
265 
266  b.Property<bool?>("Cancelled")
267  .IsRequired();
268 
269  b.Property<long?>("CancelledById");
270 
271  b.Property<string>("Description")
272  .IsRequired();
273 
274  b.Property<string>("ExceptionDetails");
275 
276  b.Property<long>("InstanceId");
277 
278  b.Property<DateTimeOffset?>("StartedAt")
279  .IsRequired();
280 
281  b.Property<long>("StartedById");
282 
283  b.Property<DateTimeOffset?>("StoppedAt");
284 
285  b.HasKey("Id");
286 
287  b.HasIndex("CancelledById");
288 
289  b.HasIndex("InstanceId");
290 
291  b.HasIndex("StartedById");
292 
293  b.ToTable("Jobs");
294  });
295 
296  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
297  {
298  b.Property<long>("Id")
299  .ValueGeneratedOnAdd()
300  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
301 
302  b.Property<string>("AccessIdentifier")
303  .IsRequired();
304 
305  b.Property<string>("ChatChannelsJson")
306  .IsRequired();
307 
308  b.Property<string>("ChatCommandsJson")
309  .IsRequired();
310 
311  b.Property<long>("CompileJobId");
312 
313  b.Property<bool>("IsPrimary");
314 
315  b.Property<int>("Port");
316 
317  b.Property<int>("ProcessId");
318 
319  b.Property<int>("RebootState");
320 
321  b.Property<string>("ServerCommandsJson")
322  .IsRequired();
323 
324  b.HasKey("Id");
325 
326  b.HasIndex("CompileJobId");
327 
328  b.ToTable("ReattachInformations");
329  });
330 
331  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
332  {
333  b.Property<long>("Id")
334  .ValueGeneratedOnAdd()
335  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
336 
337  b.Property<string>("AccessToken");
338 
339  b.Property<string>("AccessUser");
340 
341  b.Property<bool?>("AutoUpdatesKeepTestMerges")
342  .IsRequired();
343 
344  b.Property<bool?>("AutoUpdatesSynchronize")
345  .IsRequired();
346 
347  b.Property<string>("CommitterEmail")
348  .IsRequired();
349 
350  b.Property<string>("CommitterName")
351  .IsRequired();
352 
353  b.Property<long>("InstanceId");
354 
355  b.Property<bool?>("PushTestMergeCommits")
356  .IsRequired();
357 
358  b.Property<bool?>("ShowTestMergeCommitters")
359  .IsRequired();
360 
361  b.HasKey("Id");
362 
363  b.HasIndex("InstanceId")
364  .IsUnique();
365 
366  b.ToTable("RepositorySettings");
367  });
368 
369  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
370  {
371  b.Property<long>("Id")
372  .ValueGeneratedOnAdd()
373  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
374 
375  b.Property<long>("RevisionInformationId");
376 
377  b.Property<long>("TestMergeId");
378 
379  b.HasKey("Id");
380 
381  b.HasIndex("RevisionInformationId");
382 
383  b.HasIndex("TestMergeId");
384 
385  b.ToTable("RevInfoTestMerges");
386  });
387 
388  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
389  {
390  b.Property<long>("Id")
391  .ValueGeneratedOnAdd()
392  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
393 
394  b.Property<string>("CommitSha")
395  .IsRequired()
396  .HasMaxLength(40);
397 
398  b.Property<long>("InstanceId");
399 
400  b.Property<string>("OriginCommitSha")
401  .IsRequired()
402  .HasMaxLength(40);
403 
404  b.HasKey("Id");
405 
406  b.HasIndex("CommitSha")
407  .IsUnique();
408 
409  b.HasIndex("InstanceId");
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 }
+ + + + +
DatabaseContext<TParentContext> for Sqlserver
+ + + + + +
+ + + + 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..5134d34754 --- /dev/null +++ b/_sql_server_design_time_db_context_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..997f7a6e49 --- /dev/null +++ b/_sql_server_design_time_db_context_factory_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models.Migrations
8 {
10  sealed class SqlServerDesignTimeDbContextFactory : IDesignTimeDbContextFactory<SqlServerDatabaseContext>
11  {
13  public SqlServerDatabaseContext CreateDbContext(string[] args) => new SqlServerDatabaseContext(new DbContextOptions<SqlServerDatabaseContext>(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher<User>())), new LoggerFactory().CreateLogger<SqlServerDatabaseContext>());
14  }
15 }
+ +
Contains helpers for creating design time Models.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..a6a7f4126e --- /dev/null +++ b/_synchronous_i_o_manager_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/SynchronousIOManager.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SynchronousIOManager.cs File Reference
+
+ + + + + diff --git a/_synchronous_i_o_manager_8cs_source.html b/_synchronous_i_o_manager_8cs_source.html new file mode 100644 index 0000000000..7f05c009e0 --- /dev/null +++ b/_synchronous_i_o_manager_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.IO
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  if (originalBytes.Length != 0 && sha1InOut == null)
99  //no sha1? no write
100  return false;
101 
102  //suppressed due to only using for consistency checks
103 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
104  using (var sha1 = new SHA1Managed())
105 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
106  {
107  string GetSha1(byte[] dataToHash) => dataToHash != null && dataToHash.Length != 0 ? String.Join("", sha1.ComputeHash(dataToHash).Select(b => b.ToString("x2", CultureInfo.InvariantCulture))) : null;
108  var originalSha1 = GetSha1(originalBytes);
109  if (originalSha1 != sha1InOut)
110  {
111  sha1InOut = originalSha1;
112  return false;
113  }
114  sha1InOut = GetSha1(data);
115  }
116  cancellationToken.ThrowIfCancellationRequested();
117 
118  if (data != null)
119  {
120  file.Seek(0, SeekOrigin.Begin);
121 
122  cancellationToken.ThrowIfCancellationRequested();
123  file.SetLength(data.Length);
124  file.Write(data, 0, data.Length);
125  }
126  }
127  if (data == null)
128  File.Delete(path);
129  return true;
130  }
131  }
132 }
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&#39;s empty
+
IEnumerable< string > GetFiles(string path, CancellationToken cancellationToken)
Enumerate files in a given path
+ +
+ + + + diff --git a/_temporary_dmb_provider_8cs.html b/_temporary_dmb_provider_8cs.html new file mode 100644 index 0000000000..39acf87ea0 --- /dev/null +++ b/_temporary_dmb_provider_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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..542ed05ac2 --- /dev/null +++ b/_temporary_dmb_provider_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Components.Compiler
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 
39  public void KeepAlive() => throw new NotSupportedException();
40  }
41 }
TemporaryDmbProvider(string directory, string dmb, CompileJob compileJob)
Construct a TemporaryDmbProvider
+ + + + + + +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ + + +
+ + + + diff --git a/_test_api_client_8cs.html b/_test_api_client_8cs.html new file mode 100644 index 0000000000..9355dc72cc --- /dev/null +++ b/_test_api_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/TestApiClient.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestApiClient.cs File Reference
+
+ + + + + diff --git a/_test_api_client_8cs_source.html b/_test_api_client_8cs_source.html new file mode 100644 index 0000000000..ba324c0a70 --- /dev/null +++ b/_test_api_client_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + +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 
15 namespace Tgstation.Server.Client.Tests
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..b02764d9b4 --- /dev/null +++ b/_test_api_headers_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/TestApiHeaders.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestApiHeaders.cs File Reference
+
+ + + + + diff --git a/_test_api_headers_8cs_source.html b/_test_api_headers_8cs_source.html new file mode 100644 index 0000000000..f87ed55a8f --- /dev/null +++ b/_test_api_headers_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Net.Http.Headers;
4 
5 namespace Tgstation.Server.Api.Tests
6 {
10  [TestClass]
11  public sealed class TestApiHeaders
12  {
13  readonly ProductHeaderValue productHeaderValue = new ProductHeaderValue("Tgstation.Server.Api.Tests", "1.0.0");
14 
15  [TestMethod]
16  public void TestConstruction()
17  {
18  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(null, null));
19  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(productHeaderValue, null));
20  var headers = new ApiHeaders(productHeaderValue, String.Empty);
21  }
22  }
23 }
+
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..18d11cce87 --- /dev/null +++ b/_test_application_8cs.html @@ -0,0 +1,124 @@ + + + + + + +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..132322bc56 --- /dev/null +++ b/_test_application_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + +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 
15 namespace Tgstation.Server.Host.Core.Tests
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));
36 
37  var mockAppBuilder = new Mock<IApplicationBuilder>();
38  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, null, null, null));
39 
40  var mockServerControl = new Mock<IServerControl>();
41  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, null, null));
42 
43  var mockTokenFactory = new Mock<ITokenFactory>();
44  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, mockTokenFactory.Object, null));
45  }
46 
48  {
49  public Task<bool> CheckRunWizard(CancellationToken cancellationToken) => Task.FromResult(true);
50  }
51 
53  {
54  public CancellationToken ApplicationStarted => default;
55 
56  public CancellationToken ApplicationStopping => default;
57 
58  public CancellationToken ApplicationStopped => default;
59 
60  public void StopApplication() { }
61  }
62 
63  [TestMethod]
65  {
66  var mockConfiguration = new Mock<IConfiguration>();
67  Assert.ThrowsException<ArgumentNullException>(() => new Application(mockConfiguration.Object, null));
68 
69  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
70 
71  var app = new Application(mockConfiguration.Object, mockHostingEnvironment.Object);
72 
73  var mockOptions = new Mock<IOptions<GeneralConfiguration>>();
74  mockOptions.SetupGet(x => x.Value).Returns(new GeneralConfiguration
75  {
77  }).Verifiable();
78 
79  var fakeServiceDescriptor = new List<ServiceDescriptor>()
80  {
81  new ServiceDescriptor(typeof(IApplicationLifetime), typeof(MockApplicationLifetime), ServiceLifetime.Singleton),
82  new ServiceDescriptor(typeof(ISetupWizard), typeof(MockSetupWizard), ServiceLifetime.Singleton),
83  new ServiceDescriptor(typeof(IOptions<GeneralConfiguration>), mockOptions.Object)
84  };
85 
86  var mockServiceCollection = new Mock<IServiceCollection>();
87 
88  var mockConfigSection = new Mock<IConfigurationSection>();
89 
90  mockConfiguration.Setup(x => x.GetSection(It.IsNotNull<string>())).Returns(mockConfigSection.Object).Verifiable();
91  mockServiceCollection.Setup(x => x.GetEnumerator()).Returns(() => fakeServiceDescriptor.GetEnumerator()).Verifiable();
92 
93  Assert.ThrowsException<OperationCanceledException>(() => app.ConfigureServices(mockServiceCollection.Object));
94 
95  mockOptions.VerifyAll();
96  mockConfiguration.VerifyAll();
97  mockServiceCollection.VerifyAll();
98  }
99  }
100 }
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..7331e91cd2 --- /dev/null +++ b/_test_async_delayer_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestAsyncDelayer.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestAsyncDelayer.cs File Reference
+
+ + + + + diff --git a/_test_async_delayer_8cs_source.html b/_test_async_delayer_8cs_source.html new file mode 100644 index 0000000000..912253ba96 --- /dev/null +++ b/_test_async_delayer_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Core.Tests
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..e5c15ea8c3 --- /dev/null +++ b/_test_authentication_context_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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..cbeed889fe --- /dev/null +++ b/_test_authentication_context_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Security.Tests
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..9cea070d99 --- /dev/null +++ b/_test_console_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestConsole.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestConsole.cs File Reference
+
+ + + + + diff --git a/_test_console_8cs_source.html b/_test_console_8cs_source.html new file mode 100644 index 0000000000..2873048a26 --- /dev/null +++ b/_test_console_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.IO.Tests
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..dbf5b2e8de --- /dev/null +++ b/_test_d_b_connection_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestDBConnectionFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestDBConnectionFactory.cs File Reference
+
+ + + + + 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..9ffd778250 --- /dev/null +++ b/_test_d_b_connection_factory_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Core.Tests
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..b158a5c833 --- /dev/null +++ b/_test_database_context_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestDatabaseContextFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestDatabaseContextFactory.cs File Reference
+
+ + + + + diff --git a/_test_database_context_factory_8cs_source.html b/_test_database_context_factory_8cs_source.html new file mode 100644 index 0000000000..c1c39d8bd9 --- /dev/null +++ b/_test_database_context_factory_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Core.Tests
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..58c2a44194 --- /dev/null +++ b/_test_discord_provider_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..f1420d697c --- /dev/null +++ b/_test_discord_provider_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Components.Chat.Providers.Tests
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..5d3e356ccd --- /dev/null +++ b/_test_dream_daemon_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..3cea74279a --- /dev/null +++ b/_test_dream_daemon_client_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
11 namespace Tgstation.Server.Client.Components.Tests
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_git_hub_client_factory_8cs.html b/_test_git_hub_client_factory_8cs.html new file mode 100644 index 0000000000..fbf0c77056 --- /dev/null +++ b/_test_git_hub_client_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestGitHubClientFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestGitHubClientFactory.cs File Reference
+
+ + + + + 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..22ebbd4942 --- /dev/null +++ b/_test_git_hub_client_factory_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Core.Tests
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..34c216280f --- /dev/null +++ b/_test_irc_connection_string_builder_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Models/TestIrcConnectionStringBuilder.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestIrcConnectionStringBuilder.cs File Reference
+
+ + + + + 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..f1c369432c --- /dev/null +++ b/_test_irc_connection_string_builder_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models.Tests
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..2068ae371d --- /dev/null +++ b/_test_job_exception_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestJobException.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestJobException.cs File Reference
+
+ + + + + diff --git a/_test_job_exception_8cs_source.html b/_test_job_exception_8cs_source.html new file mode 100644 index 0000000000..c6e6c1aff9 --- /dev/null +++ b/_test_job_exception_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Core.Tests
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..5954c6ea13 --- /dev/null +++ b/_test_job_handler_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestJobHandler.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestJobHandler.cs File Reference
+
+ + + + + diff --git a/_test_job_handler_8cs_source.html b/_test_job_handler_8cs_source.html new file mode 100644 index 0000000000..0c17495db2 --- /dev/null +++ b/_test_job_handler_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Core.Tests
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..09640eb793 --- /dev/null +++ b/_test_merge_base_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e6093e2441 --- /dev/null +++ b/_test_merge_base_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
4 namespace Tgstation.Server.Api.Models.Internal
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;
54  PullRequestRevision = copy.PullRequestRevision;
55  TitleAtMerge = copy.TitleAtMerge;
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
+
Parameters for creating a TestMerge
+ +
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..d8e16f9beb --- /dev/null +++ b/_test_merge_parameters_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e29132fe19 --- /dev/null +++ b/_test_merge_parameters_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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 }
+ +
Parameters for creating a TestMerge
+ +
+ + + + diff --git a/_test_platform_identifier_8cs.html b/_test_platform_identifier_8cs.html new file mode 100644 index 0000000000..bff4cea287 --- /dev/null +++ b/_test_platform_identifier_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestPlatformIdentifier.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestPlatformIdentifier.cs File Reference
+
+ + + + + diff --git a/_test_platform_identifier_8cs_source.html b/_test_platform_identifier_8cs_source.html new file mode 100644 index 0000000000..0a60a90072 --- /dev/null +++ b/_test_platform_identifier_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Core.Tests
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..163188524e --- /dev/null +++ b/_test_posix_byond_installer_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..548df6b243 --- /dev/null +++ b/_test_posix_byond_installer_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Components.Byond.Tests
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..d079905a61 --- /dev/null +++ b/_test_post_write_handler_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestPostWriteHandler.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestPostWriteHandler.cs File Reference
+
+ + + + + diff --git a/_test_post_write_handler_8cs_source.html b/_test_post_write_handler_8cs_source.html new file mode 100644 index 0000000000..7cd465a357 --- /dev/null +++ b/_test_post_write_handler_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.IO.Tests
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
+
+ +
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..8f4e75eafb --- /dev/null +++ b/_test_program_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/TestProgram.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestProgram.cs File Reference
+
+ + + + + diff --git a/_test_program_8cs_source.html b/_test_program_8cs_source.html new file mode 100644 index 0000000000..260d28b51d --- /dev/null +++ b/_test_program_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
9 namespace Tgstation.Server.Host.Console.Tests
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
+ + + + + + + + + +
+ + + + diff --git a/_test_rights_8cs.html b/_test_rights_8cs.html new file mode 100644 index 0000000000..b1c6754933 --- /dev/null +++ b/_test_rights_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Rights/TestRights.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestRights.cs File Reference
+
+ + + + + diff --git a/_test_rights_8cs_source.html b/_test_rights_8cs_source.html new file mode 100644 index 0000000000..d6bf4b8228 --- /dev/null +++ b/_test_rights_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
5 namespace Tgstation.Server.Api.Rights.Tests
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..3edb235ba5 --- /dev/null +++ b/_test_server_client_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/TestServerClientFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestServerClientFactory.cs File Reference
+
+ + + + + diff --git a/_test_server_client_factory_8cs_source.html b/_test_server_client_factory_8cs_source.html new file mode 100644 index 0000000000..560db30657 --- /dev/null +++ b/_test_server_client_factory_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client.Tests
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..b712903772 --- /dev/null +++ b/_test_server_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/TestServerFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestServerFactory.cs File Reference
+
+ + + + + diff --git a/_test_server_factory_8cs_source.html b/_test_server_factory_8cs_source.html new file mode 100644 index 0000000000..29728e1715 --- /dev/null +++ b/_test_server_factory_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Tests
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..702b5c0ebd --- /dev/null +++ b/_test_server_service_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestServerService.cs File Reference
+
+ + + + + diff --git a/_test_server_service_8cs_source.html b/_test_server_service_8cs_source.html new file mode 100644 index 0000000000..f66f5e91a2 --- /dev/null +++ b/_test_server_service_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
10 namespace Tgstation.Server.Host.Service.Tests
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_setup_wizard_8cs.html b/_test_setup_wizard_8cs.html new file mode 100644 index 0000000000..aefde59ae0 --- /dev/null +++ b/_test_setup_wizard_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestSetupWizard.cs File Reference
+
+ + + + + diff --git a/_test_setup_wizard_8cs_source.html b/_test_setup_wizard_8cs_source.html new file mode 100644 index 0000000000..9e76d5c2a9 --- /dev/null +++ b/_test_setup_wizard_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + +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 
17 namespace Tgstation.Server.Host.Core.Tests
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  //saved, now for second run
148  //this time use defaults amap
149  String.Empty,
150  //test MySQL errors
151  nameof(DatabaseType.MySql),
152  String.Empty,
153  String.Empty,
154  "DbName",
155  "n",
156  "user",
157  "pass",
158  //general config
159  String.Empty,
160  String.Empty,
161  String.Empty,
162  //logging config
163  "y",
164  "not actually verified because lol mocks /../!@#$%^&*()/..///.",
165  "Warning",
166  String.Empty,
167  //third run, we already hit all the code coverage so just get through it
168  String.Empty,
169  nameof(DatabaseType.MariaDB),
170  String.Empty,
171  "dbname",
172  "y",
173  "user",
174  "pass",
175  String.Empty,
176  String.Empty,
177  String.Empty,
178  "y",
179  "will faile",
180  String.Empty,
181  String.Empty,
182  "fake",
183  "None",
184  "Critical"
185  };
186 
187  var inputPos = 0;
188 
189  mockApplication.SetupGet(x => x.VersionPrefix).Returns("sumfuk").Verifiable();
190 
191  mockConsole.Setup(x => x.PressAnyKeyAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
192  mockConsole.Setup(x => x.ReadLineAsync(It.IsAny<bool>(), It.IsAny<CancellationToken>())).Returns(() =>
193  {
194  if (inputPos == finalInputSequence.Count)
195  Assert.Fail("Exhausted input sequence!");
196  var res = finalInputSequence[inputPos++];
197  return Task.FromResult(res);
198  }).Verifiable();
199  mockConsole.Setup(x => x.WriteAsync(It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
200 
201  Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false));
202  //first real run
203  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
204 
205  //second run
206  mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(Encoding.UTF8.GetBytes(String.Empty))).Verifiable();
207  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
208 
209  //third run
210  testGeneralConfig.SetupWizardMode = SetupWizardMode.Autodetect;
211  mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull<string>(), It.IsNotNull<byte[]>(), It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
212  var firstRun = true;
213  mockIOManager.Setup(x => x.CreateDirectory(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(() =>
214  {
215  if (firstRun)
216  {
217  firstRun = false;
218  throw new Exception();
219  }
220  return Task.CompletedTask;
221  }).Verifiable();
222 
223  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
224 
225  Assert.AreEqual(finalInputSequence.Count, inputPos);
226  mockFailCommand.VerifyAll();
227  mockSuccessCommand.VerifyAll();
228  mockIOManager.VerifyAll();
229  mockGeneralConfigurationOptions.VerifyAll();
230  mockConsole.VerifyAll();
231  mockGoodDbConnection.VerifyAll();
232  mockBadDbConnection.VerifyAll();
233  mockUglyDbConnection.VerifyAll();
234  mockDBConnectionFactory.VerifyAll();
235  mockApplication.VerifyAll();
236  mockPlatformIdentifier.VerifyAll();
237  mockAsyncDelayer.VerifyAll();
238  }
239  }
240 }
+ +
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..a5ddf49732 --- /dev/null +++ b/_test_symlink_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestSymlinkFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestSymlinkFactory.cs File Reference
+
+ + + + + diff --git a/_test_symlink_factory_8cs_source.html b/_test_symlink_factory_8cs_source.html new file mode 100644 index 0000000000..23f42c5530 --- /dev/null +++ b/_test_symlink_factory_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.IO.Tests
9 {
10  [TestClass]
11  public sealed class TestSymlinkFactory
12  {
14 
15  [TestInitialize]
16  public void SelectFactory()
17  {
18  if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
19  symlinkFactory = new WindowsSymlinkFactory();
20  else
21  symlinkFactory = new PosixSymlinkFactory();
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  {
36  if (!HasPermissionToMakeSymlinks())
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  {
65  if (!HasPermissionToMakeSymlinks())
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_factory_8cs.html b/_test_watchdog_factory_8cs.html new file mode 100644 index 0000000000..8b6cdd3534 --- /dev/null +++ b/_test_watchdog_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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..a6b8a8fb80 --- /dev/null +++ b/_test_watchdog_factory_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Watchdog.Tests
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..e7a372f05e --- /dev/null +++ b/_testing_server_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Tests
 
+
+ + + + diff --git a/_testing_server_8cs_source.html b/_testing_server_8cs_source.html new file mode 100644 index 0000000000..1a5b127021 --- /dev/null +++ b/_testing_server_8cs_source.html @@ -0,0 +1,118 @@ + + + + + + +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; }
18  public bool RestartRequested => realServer.RestartRequested;
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
+ +
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+ + + + + +
+ + + + diff --git a/_tgs_authorize_attribute_8cs.html b/_tgs_authorize_attribute_8cs.html new file mode 100644 index 0000000000..b8dd3082a2 --- /dev/null +++ b/_tgs_authorize_attribute_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6bc17d17c3 --- /dev/null +++ b/_tgs_authorize_attribute_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Controllers
6 {
10  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
12  {
16  public TgsAuthorizeAttribute() { }
17 
22  public TgsAuthorizeAttribute(AdministrationRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
23 
28  public TgsAuthorizeAttribute(InstanceManagerRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
29 
34  public TgsAuthorizeAttribute(RepositoryRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
35 
40  public TgsAuthorizeAttribute(ByondRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
41 
46  public TgsAuthorizeAttribute(DreamMakerRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
47 
52  public TgsAuthorizeAttribute(DreamDaemonRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
53 
58  public TgsAuthorizeAttribute(ChatBotRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
59 
64  public TgsAuthorizeAttribute(ConfigurationRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
65 
70  public TgsAuthorizeAttribute(InstanceUserRights requiredRights) => Roles = RightsHelper.RoleNames(requiredRights);
71  }
72 }
ConfigurationRights
Rights for Models.ConfigurationFile
+ +
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+ +
InstanceUserRights
Rights for an Models.Instance
+ +
Helper for using the AuthorizeAttribute with the Api.Rights system
+ +
AdministrationRights
Rights for Models.Administration
+ +
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
+ + +
+ + + + 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..89b48d6a9b --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..f623054d72 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
5 namespace Tgstation.Server.Api.Models
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 }
+ + +
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
+ +
+ + + + 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..cd23f74b0d --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5b842d78c3 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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 }
Indicates a chat channel
Definition: ChatChannel.cs:8
+ + + +
+ + + + 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..410162ed76 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..271511987e --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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 }
+ + + + +
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..8870d37bc1 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..259eebb940 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
4 {
8  public class DreamMaker
9  {
13  public string ProjectName { get; set; }
14 
18  [Required]
19  public ushort? ApiValidationPort { get; set; }
20 
24  [Required]
25  public DreamDaemonSecurity? ApiValidationSecurityLevel { get; set; }
26  }
27 }
Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile
Definition: DreamMaker.cs:8
+ + +
DreamDaemonSecurity
DreamDaemon&#39;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..68d354c1f4 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..92ed8c34bc --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
4 namespace Tgstation.Server.Api.Models
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 
54  public Instance CloneMetadata() => new Instance
55  {
56  Id = Id,
57  Name = Name,
58  Path = Path,
59  Online = Online,
61  AutoUpdateInterval = AutoUpdateInterval
62  };
63  }
64 }
+ +
ConfigurationType
The type of configuration allowed on an Instance
+
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/_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..d55c5a7f7b --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..0163c9b558 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
4 namespace Tgstation.Server.Api.Models
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
+
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..c4d532b79d --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e3dd82762d --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 using System.ComponentModel.DataAnnotations.Schema;
4 
5 namespace Tgstation.Server.Api.Models.Internal
6 {
10  public class ChatBot
11  {
15  public long Id { get; set; }
16 
20  [Required]
21  public string Name { get; set; }
22 
26  public bool? Enabled { get; set; }
27 
31  public ChatProvider? Provider { get; set; }
32 
36  [Required]
37  public string ConnectionString { get; set; }
38 
42  [NotMapped]
43  public ChatConnectionStringBuilder ConnectionStringBuilder
44  {
45  get
46  {
47  if (ConnectionString == null)
48  return null;
49  switch (Provider)
50  {
51  case ChatProvider.Discord:
52  return new DiscordConnectionStringBuilder(ConnectionString);
53  case ChatProvider.Irc:
54  return new IrcConnectionStringBuilder(ConnectionString);
55  default:
56  throw new InvalidOperationException("Invalid Provider!");
57  }
58  }
59  set
60  {
61  if (value?.Valid == false)
62  throw new InvalidOperationException("Cannot set invalid ChatConnectionStringBuilder!");
63  ConnectionString = value?.ToString();
64  }
65  }
66  }
67 }
+ +
ChatConnectionStringBuilder for ChatProvider.Discord
+
Manage the server chat bots
Definition: ChatBot.cs:10
+ +
ChatConnectionStringBuilder for ChatProvider.Irc
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+ +
+ + + + 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..958db397b3 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6a44e5d9f1 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Api.Models.Internal
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]
38  public DreamDaemonSecurity? MinimumSecurityLevel { get; set; }
39  }
40 }
+ +
Represents a run of DreamMaker
Definition: CompileJob.cs:9
+
DreamDaemonSecurity
DreamDaemon&#39;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..8919a3883c --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..2902ffbd74 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models.Internal
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 }
+ + + + +
+ + + + 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..f2a26acda7 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..ce9e8f610c --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
5 namespace Tgstation.Server.Api.Models.Internal
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
+ + + +
Represents a long running job
Definition: Job.cs:10
+ + + +
+ + + + 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..6ab907dd03 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e252fc7267 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models.Internal
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  }
56 }
Represents configurable settings for a Repository
+ + + +
+ + + + 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..db9afc6d11 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..16acfba64e --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models.Internal
4 {
8  public class RevisionInformation
9  {
13  [Required, StringLength(40)]
14  public string CommitSha { get; set; }
15 
19  [Required, StringLength(40)]
20  public string OriginCommitSha { get; set; }
21  }
22 }
+ +
Represents information about a current git revison
+ +
+ + + + 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..7c275f87b7 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..19a405f8d6 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Api.Models.Internal
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
+ +
+ + + + 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..6eb01d34bc --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5be0334d61 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
5 namespace Tgstation.Server.Api.Models.Internal
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 }
+ +
Represents a server User
Definition: User.cs:10
+ +
AdministrationRights
Rights for Models.Administration
+
InstanceManagerRights
Rights for managing Models.Instances
+ + + +
+ + + + 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..09ca059230 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_job_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..15455e754c --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_job_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
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 }
+ + +
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..f2a32ac996 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_repository_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d9da67fef5 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_repository_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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 }
+ +
Represents a git repository
Definition: Repository.cs:8
+ + +
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..f21a9cae7d --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/RevisionInformation.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RevisionInformation.cs File Reference
+
+ + + + + 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..f9ba0b1738 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
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 }
+ + + + +
+ + + + 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..965c002f2b --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..2301ae4fd3 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
2 {
4  public sealed class TestMerge : Internal.TestMerge
5  {
9  public User MergedBy { get; set; }
10  }
11 }
+ + + +
+ + + + 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..439f16b042 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_user_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..57e872a1c0 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_user_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
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 }
+ + +
+ + + + 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..88fc90fce7 --- /dev/null +++ b/_tgstation_8_server_8_api_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Release/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..3f1185acce --- /dev/null +++ b/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Release/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("Release")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("API definitions for tgstation-server")]
18 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.0.0")]
19 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.0.0")]
20 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Api")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Api")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.0.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..9ee00c17c0 --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/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..f0cb13b64e --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/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("Release")]
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..3f7bf9e441 --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_program_8cs.html @@ -0,0 +1,113 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/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..f735cdd6bf --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/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_8_assembly_info_8cs.html b/_tgstation_8_server_8_client_8_assembly_info_8cs.html new file mode 100644 index 0000000000..c1b2251f60 --- /dev/null +++ b/_tgstation_8_server_8_client_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Release/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..b98b2e720e --- /dev/null +++ b/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Release/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("Release")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("Client library 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.Client")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Client")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.2.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..dd6a3e2dae --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/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..3eef0f64ad --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/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("Release")]
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..85ce55f127 --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_program_8cs.html @@ -0,0 +1,113 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/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..0bb889fa5e --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/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_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..d7e9bb4d8a --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5c59604492 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Chat
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 }
+ +
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+ +
+ + + + 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..9676159366 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DreamMaker.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMaker.cs File Reference
+
+ + + + + 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..656ab93136 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs_source.html @@ -0,0 +1,158 @@ + + + + + + +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 
18 namespace Tgstation.Server.Host.Components.Compiler
19 {
21  sealed class DreamMaker : IDreamMaker
22  {
26  public const string ADirectoryName = "A";
30  public const string BDirectoryName = "B";
34  public const string DmbExtension = ".dmb";
38  const string DmeExtension = "dme";
39 
43  readonly IByondManager byond;
51  readonly StaticFiles.IConfiguration configuration;
71  readonly IChat chat;
79  readonly IWatchdog watchdog;
83  readonly ILogger<DreamMaker> logger;
84 
88  bool compiling;
89 
104  public 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)
105  {
106  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
107  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
108  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
109  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
110  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
111  this.application = application ?? throw new ArgumentNullException(nameof(application));
112  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
113  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
114  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
115  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
116  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
117  }
118 
129  async Task VerifyApi(uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)
130  {
131  logger.LogTrace("Verifying DMAPI...");
132  var launchParameters = new DreamDaemonLaunchParameters
133  {
134  AllowWebClient = false,
135  PrimaryPort = portToUse,
136  SecurityLevel = securityLevel, //all it needs to read the file and exit
137  StartupTimeout = timeout
138  };
139 
140  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
141 
142  job.MinimumSecurityLevel = securityLevel; //needed for the TempDmbProvider
143  var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job);
144 
145  var timeoutAt = DateTimeOffset.Now.AddSeconds(timeout);
146  using (var controller = await sessionControllerFactory.LaunchNew(launchParameters, provider, byondLock, true, true, true, cancellationToken).ConfigureAwait(false))
147  {
148  var launchResult = await controller.LaunchResult.ConfigureAwait(false);
149 
150  var now = DateTimeOffset.Now;
151  if (now < timeoutAt && launchResult.StartupTime.HasValue)
152  {
153  var timeoutTask = Task.Delay(timeoutAt - now, cancellationToken);
154 
155  await Task.WhenAny(controller.Lifetime, timeoutTask).ConfigureAwait(false);
156  cancellationToken.ThrowIfCancellationRequested();
157  }
158 
159  if (controller.Lifetime.IsCompleted)
160  {
161  var validationStatus = controller.ApiValidationStatus;
162  logger.LogTrace("API validation status: {0}", validationStatus);
163  switch (validationStatus)
164  {
165  case ApiValidationStatus.RequiresUltrasafe:
166  job.MinimumSecurityLevel = DreamDaemonSecurity.Ultrasafe;
167  return;
168  case ApiValidationStatus.RequiresSafe:
169  if (securityLevel == DreamDaemonSecurity.Ultrasafe)
170  throw new JobException("This game must be run with at least the 'Safe' DreamDaemon security level!");
171  job.MinimumSecurityLevel = DreamDaemonSecurity.Safe;
172  return;
173  case ApiValidationStatus.RequiresTrusted:
174  if (securityLevel != DreamDaemonSecurity.Trusted)
175  throw new JobException("This game must be run with at least the 'Trusted' DreamDaemon security level!");
176  job.MinimumSecurityLevel = DreamDaemonSecurity.Trusted;
177  return;
178  case ApiValidationStatus.NeverValidated:
179  break;
180  case ApiValidationStatus.BadValidationRequest:
181  throw new JobException("Recieved an unrecognized API validation request from DreamDaemon!");
182  case ApiValidationStatus.UnaskedValidationRequest:
183  default:
184  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Session controller returned unexpected ApiValidationStatus: {0}", validationStatus));
185  }
186  }
187 
188  throw new JobException("DMAPI validation timed out!");
189  }
190  }
191 
199  async Task<int> RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
200  {
201  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))
202  {
203  int exitCode;
204  using (cancellationToken.Register(() => dm.Terminate()))
205  exitCode = await dm.Lifetime.ConfigureAwait(false);
206  cancellationToken.ThrowIfCancellationRequested();
207 
208  logger.LogDebug("DreamMaker exit code: {0}", exitCode);
209  job.Output = dm.GetCombinedOutput();
210  logger.LogTrace("DreamMaker output: {0}{1}", Environment.NewLine, job.Output);
211  return exitCode;
212  }
213  }
214 
221  async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
222  {
223  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
224  var dmeFileName = String.Join('.', job.DmeName, DmeExtension);
225  var dmePath = ioManager.ConcatPath(dirA, dmeFileName);
226  var dmeReadTask = ioManager.ReadAllBytes(dmePath, cancellationToken);
227 
228  var dmeModificationsTask = configuration.CopyDMFilesTo(dmeFileName, ioManager.ResolvePath(dirA), cancellationToken);
229 
230  var dmeBytes = await dmeReadTask.ConfigureAwait(false);
231  var dme = Encoding.UTF8.GetString(dmeBytes);
232 
233  var dmeModifications = await dmeModificationsTask.ConfigureAwait(false);
234 
235  if (dmeModifications == null || dmeModifications.TotalDmeOverwrite)
236  {
237  if (dmeModifications != null)
238  logger.LogDebug(".dme replacement configured!");
239  else
240  logger.LogTrace("No .dme modifications required.");
241  return;
242  }
243 
244  if (dmeModifications.HeadIncludeLine != null)
245  logger.LogDebug("Head .dme include line: {0}", dmeModifications.HeadIncludeLine);
246  if (dmeModifications.TailIncludeLine != null)
247  logger.LogDebug("Tail .dme include line: {0}", dmeModifications.TailIncludeLine);
248 
249  var dmeLines = new List<string>(dme.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
250  for (var I = 0; I < dmeLines.Count; ++I)
251  {
252  var line = dmeLines[I];
253  if (line.Contains("BEGIN_INCLUDE", StringComparison.Ordinal) && dmeModifications.HeadIncludeLine != null)
254  {
255  dmeLines.Insert(I + 1, dmeModifications.HeadIncludeLine);
256  ++I;
257  }
258  else if (line.Contains("END_INCLUDE", StringComparison.Ordinal) && dmeModifications.TailIncludeLine != null)
259  {
260  dmeLines.Insert(I, dmeModifications.TailIncludeLine);
261  break;
262  }
263  }
264 
265  dmeBytes = Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, dmeLines));
266  await ioManager.WriteAllBytes(dmePath, dmeBytes, cancellationToken).ConfigureAwait(false);
267  }
268 
270  public async Task<Models.CompileJob> Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action<int> progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
271  {
272  if (revisionInformation == null)
273  throw new ArgumentNullException(nameof(revisionInformation));
274 
275  if (dreamMakerSettings == null)
276  throw new ArgumentNullException(nameof(dreamMakerSettings));
277 
278  if (repository == null)
279  throw new ArgumentNullException(nameof(repository));
280 
281  if (progressReporter == null)
282  throw new ArgumentNullException(nameof(progressReporter));
283 
284  if (dreamMakerSettings.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
285  throw new ArgumentOutOfRangeException(nameof(dreamMakerSettings), dreamMakerSettings, "Cannot compile with ultrasafe security!");
286 
287  logger.LogTrace("Begin Compile");
288 
289  var job = new Models.CompileJob
290  {
291  DirectoryName = Guid.NewGuid(),
292  DmeName = dreamMakerSettings.ProjectName,
293  RevisionInformation = revisionInformation
294  };
295 
296  logger.LogTrace("Compile output GUID: {0}", job.DirectoryName);
297 
298  lock (this)
299  {
300  if (compiling)
301  throw new JobException("There is already a compile job in progress!");
302  compiling = true;
303  }
304 
305  using (var progressCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
306  {
307  async Task ProgressTask()
308  {
309  if (!estimatedDuration.HasValue)
310  return;
311 
312  progressReporter(0);
313  var ct = progressCts.Token;
314  var sleepInterval = estimatedDuration.Value / 100;
315 
316  try
317  {
318  for (var I = 0; I < 99; ++I)
319  {
320  await Task.Delay(sleepInterval, progressCts.Token).ConfigureAwait(false);
321  progressReporter(I + 1);
322  }
323  }
324  catch (OperationCanceledException) { }
325  }
326 
327  var progressTask = ProgressTask();
328  try
329  {
330 
331 
332  var commitInsert = revisionInformation.CommitSha.Substring(0, 7);
333  string remoteCommitInsert;
334  if (revisionInformation.CommitSha == revisionInformation.OriginCommitSha)
335  {
336  commitInsert = String.Format(CultureInfo.InvariantCulture, "^{0}", commitInsert);
337  remoteCommitInsert = String.Empty;
338  }
339  else
340  remoteCommitInsert = String.Format(CultureInfo.InvariantCulture, ". Remote commit: ^{0}", revisionInformation.OriginCommitSha.Substring(0, 7));
341 
342  var testmergeInsert = revisionInformation.ActiveTestMerges.Count == 0 ? String.Empty : String.Format(CultureInfo.InvariantCulture, " (Test Merges: {0})",
343  String.Join(", ", revisionInformation.ActiveTestMerges.Select(x => x.TestMerge).Select(x =>
344  {
345  var result = String.Format(CultureInfo.InvariantCulture, "#{0} at {1}", x.Number, x.PullRequestRevision.Substring(0, 7));
346  if (x.Comment != null)
347  result += String.Format(CultureInfo.InvariantCulture, " ({0})", x.Comment);
348  return result;
349  })));
350 
351  using (var byondLock = await byond.UseExecutables(null, cancellationToken).ConfigureAwait(false))
352  {
353  await chat.SendUpdateMessage(String.Format(CultureInfo.InvariantCulture, "Deploying revision: {0}{1}{2} BYOND Version: {3}", commitInsert, testmergeInsert, remoteCommitInsert, byondLock.Version), cancellationToken).ConfigureAwait(false);
354 
355  async Task CleanupFailedCompile(bool cancelled)
356  {
357  logger.LogTrace("Cleaning compile directory...");
358  var chatTask = chat.SendUpdateMessage(cancelled ? "Deploy cancelled!" : "Deploy failed!", cancellationToken);
359  try
360  {
361  await ioManager.DeleteDirectory(job.DirectoryName.ToString(), CancellationToken.None).ConfigureAwait(false);
362  }
363  catch (Exception e)
364  {
365  logger.LogWarning("Error cleaning up compile directory {0}! Exception: {1}", ioManager.ResolvePath(job.DirectoryName.ToString()), e);
366  }
367 
368  await chatTask.ConfigureAwait(false);
369  };
370 
371  try
372  {
373  await ioManager.CreateDirectory(job.DirectoryName.ToString(), cancellationToken).ConfigureAwait(false);
374 
375  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
376  var dirB = ioManager.ConcatPath(job.DirectoryName.ToString(), BDirectoryName);
377 
378  logger.LogTrace("Copying repository to game directory...");
379  //copy the repository
380  var fullDirA = ioManager.ResolvePath(dirA);
381  var repoOrigin = repository.Origin;
382  using (repository)
383  await repository.CopyTo(fullDirA, cancellationToken).ConfigureAwait(false);
384 
385  //run precompile scripts
386  var resolvedGameDirectory = ioManager.ResolvePath(ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName));
387  await eventConsumer.HandleEvent(EventType.CompileStart, new List<string> { resolvedGameDirectory, repoOrigin }, cancellationToken).ConfigureAwait(false);
388 
389  //determine the dme
390  if (job.DmeName == null)
391  {
392  logger.LogTrace("Searching for available .dmes...");
393  var path = (await ioManager.GetFilesWithExtension(dirA, DmeExtension, cancellationToken).ConfigureAwait(false)).FirstOrDefault();
394  if (path == default)
395  throw new JobException("Unable to find any .dme!");
396  var dmeWithExtension = ioManager.GetFileName(path);
397  job.DmeName = dmeWithExtension.Substring(0, dmeWithExtension.Length - DmeExtension.Length - 1);
398  }
399  else if (!await ioManager.FileExists(ioManager.ConcatPath(dirA, String.Join('.', job.DmeName, DmeExtension)), cancellationToken).ConfigureAwait(false))
400  throw new JobException("Unable to locate specified .dme!");
401 
402  logger.LogDebug("Selected {0}.dme for compilation!", job.DmeName);
403 
404  await ModifyDme(job, cancellationToken).ConfigureAwait(false);
405 
406  //run compiler, verify api
407  job.ByondVersion = byondLock.Version.ToString();
408 
409  var exitCode = await RunDreamMaker(byondLock.DreamMakerPath, job, cancellationToken).ConfigureAwait(false);
410 
411  try
412  {
413  if (exitCode != 0)
414  throw new JobException(String.Format(CultureInfo.InvariantCulture, "DM exited with a non-zero code: {0}{1}{2}", exitCode, Environment.NewLine, job.Output));
415 
416  await VerifyApi(apiValidateTimeout, dreamMakerSettings.ApiValidationSecurityLevel.Value, job, byondLock, dreamMakerSettings.ApiValidationPort.Value, cancellationToken).ConfigureAwait(false);
417  }
418  catch (JobException)
419  {
420  //server never validated or compile failed
421  await eventConsumer.HandleEvent(EventType.CompileFailure, new List<string> { resolvedGameDirectory, exitCode == 0 ? "1" : "0" }, cancellationToken).ConfigureAwait(false);
422  throw;
423  }
424 
425  logger.LogTrace("Running post compile event...");
426  await eventConsumer.HandleEvent(EventType.CompileComplete, new List<string> { ioManager.ResolvePath(ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName)) }, cancellationToken).ConfigureAwait(false);
427 
428  logger.LogTrace("Duplicating compiled game...");
429 
430  //duplicate the dmb et al
431  await ioManager.CopyDirectory(dirA, dirB, null, cancellationToken).ConfigureAwait(false);
432 
433  logger.LogTrace("Applying static game file symlinks...");
434 
435  //symlink in the static data
436  var symATask = configuration.SymlinkStaticFilesTo(fullDirA, cancellationToken);
437  var symBTask = configuration.SymlinkStaticFilesTo(ioManager.ResolvePath(dirB), cancellationToken);
438 
439  await Task.WhenAll(symATask, symBTask).ConfigureAwait(false);
440 
441  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);
442 
443  logger.LogDebug("Compile complete!");
444  return job;
445  }
446  catch (Exception e)
447  {
448  await CleanupFailedCompile(e is OperationCanceledException).ConfigureAwait(false);
449  throw;
450  }
451  }
452  }
453  catch (OperationCanceledException)
454  {
455  await eventConsumer.HandleEvent(EventType.CompileCancelled, null, default).ConfigureAwait(false);
456  throw;
457  }
458  finally
459  {
460  compiling = false;
461  progressCts.Cancel();
462  await progressTask.ConfigureAwait(false);
463  }
464  }
465  }
466  }
467 }
+ + + +
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:83
+ +
Consumes EventTypes and takes the appropriate actions
+ +
readonly StaticFiles.IConfiguration configuration
The StaticFiles.IConfiguration for DreamMaker
Definition: DreamMaker.cs:51
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ + + + + +
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
Represents an on-disk git repository
Definition: IRepository.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:270
+
bool compiling
If a compile job is running
Definition: DreamMaker.cs:88
+
For managing connected chat services
Definition: IChat.cs:13
+ +
readonly IProcessExecutor processExecutor
The IProcessExecutor for DreamMaker
Definition: DreamMaker.cs:75
+
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for DreamMaker
Definition: DreamMaker.cs:55
+
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:67
+ + + +
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:129
+
string Origin
The current origin remote the IRepository is using
Definition: IRepository.cs:46
+ +
For managing the BYOND installation
+
async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
Adds server side includes to the .dme being compiled
Definition: DreamMaker.cs:221
+
readonly IChat chat
The IChat for DreamMaker
Definition: DreamMaker.cs:71
+ +
readonly IWatchdog watchdog
The IWatchdog for DreamMaker
Definition: DreamMaker.cs:79
+
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:59
+ +
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:47
+
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:104
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
Represents information about a current git revison
+
readonly IApplication application
The IApplication for DreamMaker
Definition: DreamMaker.cs:63
+ +
async Task< int > RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
Compiles a .dme with DreamMaker
Definition: DreamMaker.cs:199
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ +
readonly IByondManager byond
The IByondManager for DreamMaker
Definition: DreamMaker.cs:43
+
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..ac71faf1ac --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_instance_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Instance.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Instance.cs File Reference
+
+ + + + + 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..26330c723a --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html @@ -0,0 +1,202 @@ + + + + + + +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 
19 namespace Tgstation.Server.Host.Components
20 {
22  sealed class Instance : IInstance
23  {
26 
28  public IByondManager ByondManager { get; }
29 
31  public IDreamMaker DreamMaker { get; }
32 
34  public IWatchdog Watchdog { get; }
35 
37  public IChat Chat { get; }
38 
40  public StaticFiles.IConfiguration Configuration { get; }
41 
43  public ICompileJobConsumer CompileJobConsumer { get; }
44 
49 
54 
59 
64 
69 
73  readonly ILogger<Instance> logger;
74 
78  readonly Api.Models.Instance metadata;
79 
83  Task timerTask;
87  CancellationTokenSource timerCts;
88 
106  public 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)
107  {
108  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
109  RepositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
110  ByondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
111  DreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
112  Watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
113  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
114  Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
115  CompileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
116  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
117  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
118  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
119  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
120  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
121  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
122  }
123 
125  public void Dispose()
126  {
127  timerCts?.Dispose();
128  CompileJobConsumer.Dispose();
129  Configuration.Dispose();
130  Chat.Dispose();
131  Watchdog.Dispose();
133  }
134 
136  public async Task CompileProcess(Job job, IDatabaseContext databaseContext, Action<int> progressReporter, CancellationToken cancellationToken)
137  {
138  //DO NOT FOLLOW THE SUGGESTION FOR A THROW EXPRESSION HERE
139  if (job == null)
140  throw new ArgumentNullException(nameof(job));
141  if (databaseContext == null)
142  throw new ArgumentNullException(nameof(databaseContext));
143  if (progressReporter == null)
144  throw new ArgumentNullException(nameof(progressReporter));
145 
146  var ddSettingsTask = databaseContext.DreamDaemonSettings.Where(x => x.InstanceId == metadata.Id).Select(x => new DreamDaemonSettings
147  {
148  StartupTimeout = x.StartupTimeout,
149  }).FirstOrDefaultAsync(cancellationToken);
150 
151  var compileJobsTask = databaseContext.CompileJobs
152  .Where(x => x.Job.Instance.Id == metadata.Id)
153  .OrderByDescending(x => x.Job.StoppedAt)
154  //TODO: Replace with this select when the issues linked in https://github.com/tgstation/tgstation-server/issues/737 are fixed
155  //.Select(x => x.Job.StoppedAt.Value - x.Job.StartedAt.Value)
156  .Select(x => new Job
157  {
158  StoppedAt = x.Job.StoppedAt,
159  StartedAt = x.Job.StartedAt
160  })
161  .Take(10)
162  .ToListAsync(cancellationToken);
163 
164  var dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
165  if (dreamMakerSettings == default)
166  throw new JobException("Missing DreamMakerSettings in DB!");
167  var ddSettings = await ddSettingsTask.ConfigureAwait(false);
168  if (ddSettings == default)
169  throw new JobException("Missing DreamDaemonSettings in DB!");
170 
171  Task<RepositorySettings> repositorySettingsTask = null;
172  string repoOwner = null;
173  string repoName = null;
174  CompileJob compileJob;
175  RevisionInformation revInfo;
176  using (var repo = await RepositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
177  {
178  if (repo == null)
179  throw new JobException("Missing Repository!");
180 
181  if (repo.IsGitHubRepository)
182  {
183  repoOwner = repo.GitHubOwner;
184  repoName = repo.GitHubRepoName;
185  repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).Select(x => new RepositorySettings
186  {
187  AccessToken = x.AccessToken,
188  ShowTestMergeCommitters = x.ShowTestMergeCommitters
189  }).FirstOrDefaultAsync(cancellationToken);
190  }
191 
192  var repoSha = repo.Head;
193  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);
194 
195  if (revInfo == default)
196  {
197  revInfo = new RevisionInformation
198  {
199  CommitSha = repoSha,
200  OriginCommitSha = repoSha,
201  Instance = new Models.Instance
202  {
203  Id = metadata.Id
204  }
205  };
206  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
207  databaseContext.Instances.Attach(revInfo.Instance);
208  }
209 
210  TimeSpan? averageSpan = null;
211  var previousCompileJobs = await compileJobsTask.ConfigureAwait(false);
212  if(previousCompileJobs.Count != 0)
213  {
214  var totalSpan = TimeSpan.Zero;
215  foreach (var I in previousCompileJobs)
216  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
217  averageSpan = totalSpan / previousCompileJobs.Count;
218  }
219 
220  compileJob = await DreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
221  }
222 
223  compileJob.Job = job;
224 
225  databaseContext.CompileJobs.Add(compileJob); //will be saved by job context
226 
227  job.PostComplete = ct => CompileJobConsumer.LoadCompileJob(compileJob, ct);
228 
229  if (repositorySettingsTask != null)
230  {
231  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
232  if (repositorySettings == default)
233  throw new JobException("Missing repository settings!");
234 
235  if (repositorySettings.AccessToken != null)
236  {
237  //potential for commenting on a test merge change
238  var outgoingCompileJob = LatestCompileJob();
239 
240  if(outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha != compileJob.RevisionInformation.CommitSha)
241  {
242  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
243 
244  async Task CommentOnPR(int prNumber, string comment)
245  {
246  try
247  {
248  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
249  }
250  catch (ApiException e)
251  {
252  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
253  }
254  }
255 
256  var tasks = new List<Task>();
257 
258  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}",
259  Environment.NewLine,
260  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
261  testMerge.PullRequestRevision,
262  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
263  updated ? "Updated" : "Deployed",
264  metadata.Name,
266  compileJob.RevisionInformation.CommitSha
267  );
268 
269  //added prs
270  foreach (var I in compileJob
272  .ActiveTestMerges
273  .Select(x => x.TestMerge)
274  .Where(x => !outgoingCompileJob
276  .ActiveTestMerges
277  .Any(y => y.TestMerge.Number == x.Number)))
278  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, false)));
279 
280  //removed prs
281  foreach (var I in outgoingCompileJob
283  .ActiveTestMerges
284  .Select(x => x.TestMerge)
285  .Where(x => !compileJob
288  .Any(y => y.TestMerge.Number == x.Number)))
289  tasks.Add(CommentOnPR(I.Number.Value, "#### Test Merge Removed"));
290 
291  //updated prs
292  foreach(var I in compileJob
294  .ActiveTestMerges
295  .Select(x => x.TestMerge)
296  .Where(x => outgoingCompileJob
297  .RevisionInformation
298  .ActiveTestMerges
299  .Any(y => y.TestMerge.Number == x.Number)))
300  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, true)));
301 
302  if (tasks.Any())
303  await Task.WhenAll(tasks).ConfigureAwait(false);
304  }
305  }
306  }
307  }
308 
315  async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
316  {
317  while (true)
318  try
319  {
320  await Task.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : (int)minutes), cancellationToken).ConfigureAwait(false);
321  logger.LogDebug("Beginning auto update...");
322  await eventConsumer.HandleEvent(EventType.InstanceAutoUpdateStart, new List<string>(), cancellationToken).ConfigureAwait(false);
323  try
324  {
325  Models.User user = null;
326  await databaseContextFactory.UseContext(async (db) => user = await db.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
327  var repositoryUpdateJob = new Job
328  {
329  Instance = new Models.Instance
330  {
331  Id = metadata.Id
332  },
333  Description = "Scheduled repository update",
334  CancelRightsType = RightsType.Repository,
335  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
336  StartedBy = user
337  };
338 
339  string deploySha = null;
340  await jobManager.RegisterOperation(repositoryUpdateJob, async (paramJob, databaseContext, progressReporter, jobCancellationToken) =>
341  {
342  var repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(jobCancellationToken);
343 
344  //assume 5 steps with synchronize
345  const int ProgressSections = 7;
346  const int ProgressStep = 100 / ProgressSections;
347 
348 
349  const int NumSteps = 3;
350  var doneSteps = 0;
351 
352  Action<int> NextProgressReporter()
353  {
354  var tmpDoneSteps = doneSteps;
355  ++doneSteps;
356  return progress => progressReporter((progress + 100 * tmpDoneSteps) / NumSteps);
357  };
358 
359  using (var repo = await RepositoryManager.LoadRepository(jobCancellationToken).ConfigureAwait(false))
360  {
361  if (repo == null)
362  {
363  logger.LogTrace("Aborting repo update, no repository!");
364  return;
365  }
366 
367  var startSha = repo.Head;
368  if (!repo.Tracking)
369  {
370  logger.LogTrace("Aborting repo update, not tracking origin!");
371  deploySha = startSha;
372  return;
373  }
374 
375  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
376 
377  //the main point of auto update is to pull the remote
378  await repo.FetchOrigin(repositorySettings.AccessUser, repositorySettings.AccessToken, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
379 
380  RevisionInformation currentRevInfo = null;
381  bool hasDbChanges = false;
382 
383  Task<RevisionInformation> LoadRevInfo() => databaseContext.RevisionInformations
384  .Where(x => x.CommitSha == startSha && x.Instance.Id == metadata.Id)
385  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge)
386  .FirstOrDefaultAsync(cancellationToken);
387 
388  async Task UpdateRevInfo(string currentHead, bool onOrigin)
389  {
390  if(currentRevInfo == null)
391  currentRevInfo = await LoadRevInfo().ConfigureAwait(false);
392 
393  if (currentRevInfo == default)
394  {
395  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, currentHead);
396  onOrigin = true;
397  }
398 
399  var attachedInstance = new Models.Instance
400  {
401  Id = metadata.Id
402  };
403  var oldRevInfo = currentRevInfo;
404  currentRevInfo = new RevisionInformation
405  {
406  CommitSha = currentHead,
407  OriginCommitSha = onOrigin ? currentHead : oldRevInfo.OriginCommitSha,
408  Instance = attachedInstance
409  };
410  if (!onOrigin)
411  currentRevInfo.ActiveTestMerges = new List<RevInfoTestMerge>(oldRevInfo.ActiveTestMerges);
412 
413  databaseContext.Instances.Attach(attachedInstance);
414  databaseContext.RevisionInformations.Add(currentRevInfo);
415  hasDbChanges = true;
416  }
417 
418  //take appropriate auto update actions
419  bool shouldSyncTracked;
420  if (repositorySettings.AutoUpdatesKeepTestMerges.Value)
421  {
422  logger.LogTrace("Preserving test merges...");
423 
424  var currentRevInfoTask = LoadRevInfo();
425 
426  var result = await repo.MergeOrigin(repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
427 
428  if (!result.HasValue)
429  throw new JobException("Merge conflict while preserving test merges!");
430 
431  currentRevInfo = await currentRevInfoTask.ConfigureAwait(false);
432 
433  var lastRevInfoWasOriginCommit = currentRevInfo == default || currentRevInfo.CommitSha == currentRevInfo.OriginCommitSha;
434  var stillOnOrigin = result.Value && lastRevInfoWasOriginCommit;
435 
436  var currentHead = repo.Head;
437  if (currentHead != startSha)
438  {
439  await UpdateRevInfo(currentHead, stillOnOrigin).ConfigureAwait(false);
440  shouldSyncTracked = stillOnOrigin;
441  }
442  else
443  shouldSyncTracked = false;
444  }
445  else
446  {
447  logger.LogTrace("Not preserving test merges...");
448  await repo.ResetToOrigin(NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
449 
450  var currentHead = repo.Head;
451 
452  currentRevInfo = await databaseContext.RevisionInformations
453  .Where(x => x.CommitSha == currentHead && x.Instance.Id == metadata.Id)
454  .FirstOrDefaultAsync(jobCancellationToken).ConfigureAwait(false);
455 
456  if (currentHead != startSha && currentRevInfo != default)
457  await UpdateRevInfo(currentHead, true).ConfigureAwait(false);
458 
459  shouldSyncTracked = true;
460  }
461 
462  //synch if necessary
463  if (repositorySettings.AutoUpdatesSynchronize.Value && startSha != repo.Head)
464  {
465  var pushedOrigin = await repo.Sychronize(repositorySettings.AccessUser, repositorySettings.AccessToken, repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), shouldSyncTracked, jobCancellationToken).ConfigureAwait(false);
466  var currentHead = repo.Head;
467  if (currentHead != currentRevInfo.CommitSha)
468  await UpdateRevInfo(currentHead, pushedOrigin).ConfigureAwait(false);
469  }
470 
471  if(hasDbChanges)
472  try
473  {
474  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
475  }
476  catch
477  {
478  await repo.ResetToSha(startSha, progressReporter, default).ConfigureAwait(false);
479  throw;
480  }
481 
482  progressReporter(5 * ProgressStep);
483  deploySha = repo.Head;
484  }
485  }, cancellationToken).ConfigureAwait(false);
486 
487  await jobManager.WaitForJobCompletion(repositoryUpdateJob, user, cancellationToken, default).ConfigureAwait(false);
488 
489  if (deploySha == null)
490  {
491  logger.LogTrace("Aborting auto update, repository error!");
492  continue;
493  }
494 
495  if(deploySha == LatestCompileJob()?.RevisionInformation.CommitSha)
496  {
497  logger.LogTrace("Aborting auto update, same revision as latest CompileJob");
498  continue;
499  }
500 
501  //finally set up the job
502  var compileProcessJob = new Job
503  {
504  StartedBy = user,
505  Instance = repositoryUpdateJob.Instance,
506  Description = "Scheduled code deployment",
507  CancelRightsType = RightsType.DreamMaker,
508  CancelRight = (ulong)DreamMakerRights.CancelCompile
509  };
510 
511  await jobManager.RegisterOperation(compileProcessJob, CompileProcess, cancellationToken).ConfigureAwait(false);
512 
513  await jobManager.WaitForJobCompletion(compileProcessJob, user, cancellationToken, default).ConfigureAwait(false);
514  }
515  catch (OperationCanceledException)
516  {
517  logger.LogDebug("Cancelled auto update job!");
518  throw;
519  }
520  catch (Exception e)
521  {
522  logger.LogWarning("Error in auto update loop! Exception: {0}", e);
523  continue;
524  }
525  }
526  catch (OperationCanceledException)
527  {
528  break;
529  }
530  logger.LogTrace("Leaving auto update loop...");
531  }
532 
534  public void Rename(string newName)
535  {
536  if (String.IsNullOrWhiteSpace(newName))
537  throw new ArgumentNullException(nameof(newName));
538  metadata.Name = newName;
539  }
540 
542  public async Task StartAsync(CancellationToken cancellationToken)
543  {
544  await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), CompileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
545 
546  //dependent on so many things, its just safer this way
547  await Watchdog.StartAsync(cancellationToken).ConfigureAwait(false);
548 
549  CompileJob latestCompileJob = null;
550  await databaseContextFactory.UseContext(async db =>
551  {
552  latestCompileJob = await db.CompileJobs.Where(x => x.Job.Instance.Id == metadata.Id).OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
553  }).ConfigureAwait(false);
554  await dmbFactory.CleanUnusedCompileJobs(latestCompileJob, cancellationToken).ConfigureAwait(false);
555  }
556 
558  public Task StopAsync(CancellationToken cancellationToken) => Task.WhenAll(SetAutoUpdateInterval(0), Configuration.StopAsync(cancellationToken), ByondManager.StopAsync(cancellationToken), Watchdog.StopAsync(cancellationToken), Chat.StopAsync(cancellationToken), CompileJobConsumer.StopAsync(cancellationToken));
559 
561  public async Task SetAutoUpdateInterval(uint newInterval)
562  {
563  Task toWait;
564  lock (this)
565  {
566  if (timerTask != null)
567  {
568  timerCts.Cancel();
569  toWait = timerTask;
570  }
571  else
572  toWait = Task.CompletedTask;
573  }
574  await toWait.ConfigureAwait(false);
575  if (newInterval == 0)
576  return;
577  lock (this)
578  {
579  //race condition, just quit
580  if (timerTask != null)
581  return;
582  timerCts?.Dispose();
583  timerCts = new CancellationTokenSource();
584  timerTask = TimerLoop(newInterval, timerCts.Token);
585  }
586  }
587 
590  {
591  if (!dmbFactory.DmbAvailable)
592  return null;
593  return dmbFactory.LockNextDmb(0)?.CompileJob;
594  }
595  }
596 }
+
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.IJobManager
Definition: Instance.cs:136
+ + +
async Task SetAutoUpdateInterval(uint newInterval)
Change the Api.Models.Instance.AutoUpdateInterval for the IInstance
Definition: Instance.cs:561
+ + +
CompileJob LatestCompileJob()
The latest staged CompileJob
Definition: Instance.cs:589
+ + + +
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:534
+ +
DateTimeOffset StoppedAt
When the Job stopped
Definition: Job.cs:37
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
async Task StartAsync(CancellationToken cancellationToken)
+
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:270
+
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:118
+
Job Job
See Api.Models.CompileJob.Job
Definition: CompileJob.cs:13
+ + + +
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the Instance
Definition: Instance.cs:68
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Instance
Definition: Instance.cs:63
+
Task timerTask
The auto update Task
Definition: Instance.cs:83
+ + +
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:78
+
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:106
+
Func< CancellationToken, Task > PostComplete
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
Definition: Job.cs:34
+
CancellationTokenSource timerCts
CancellationTokenSource for timerTask
Definition: Instance.cs:87
+ +
async Task StopAsync(CancellationToken cancellationToken)
Definition: Watchdog.cs:990
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Instance
Definition: Instance.cs:48
+
DbSet< RepositorySettings > RepositorySettings
The Models.RepositorySettings in the IDatabaseContext
+ +
For interacting with the instance services
Definition: IInstance.cs:17
+
DreamMakerRights
Rights for Models.DreamMaker
+
readonly ILogger< Instance > logger
The ILogger for the Instance
Definition: Instance.cs:73
+
For managing the BYOND installation
+
async Task StopAsync(CancellationToken cancellationToken)
Definition: Chat.cs:537
+
RepositoryRights
Rights for a Models.Repository
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
Pull the repository and compile for every set of given minutes
Definition: Instance.cs:315
+ +
DbSet< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext
+ +
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
+ + +
Factory for creating and loading IRepositorys
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: Watchdog.cs:956
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: Chat.cs:525
+ + +
readonly IDmbFactory dmbFactory
The IDmbFactory for the Instance
Definition: Instance.cs:53
+ + +
readonly IJobManager jobManager
The IJobManager for the Instance
Definition: Instance.cs:58
+
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:542
+
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..5995f53e42 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..37a48c9985 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Components.Interop
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 }
+ + +
Layer of test merge data required internally
Definition: TestMergeBase.cs:9
+ + +
This model mirrors /datum/tgs_revision_information/test_merge
Definition: TestMerge.cs:10
+
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..fc8f557abb --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/Repository.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Repository.cs File Reference
+
+ + + + + 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..67de21c1ae --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs_source.html @@ -0,0 +1,145 @@ + + + + + + +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 
14 namespace Tgstation.Server.Host.Components.Repository
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 
87  void GetRepositoryOwnerName(string remote, out string owner, out string name)
88  {
89  //Assume standard gh format: [(git)|(https)]://github.com/owner/repo(.git)[0-1]
90  //Yes use .git twice in case it was weird
91  var toRemove = new string[] { ".git", "/", ".git" };
92  foreach (string item in toRemove)
93  if (remote.EndsWith(item, StringComparison.OrdinalIgnoreCase))
94  remote = remote.Substring(0, remote.LastIndexOf(item, StringComparison.OrdinalIgnoreCase));
95  var splits = remote.Split('/');
96  name = splits[splits.Length - 1];
97  owner = splits[splits.Length - 2].Split('.')[0];
98 
99  logger.LogTrace("GetRepositoryOwnerName({0}) => {1} / {2}", remote, owner, name);
100  }
101 
107  static CheckoutProgressHandler CheckoutProgressHandler(Action<int> progressReporter) => (a, completedSteps, totalSteps) => progressReporter((int)((((float)completedSteps) / totalSteps) * 100));
108 
118  public Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger<Repository> logger, Action onDispose)
119  {
120  this.repository = repository ?? throw new ArgumentNullException(nameof(repository));
121  this.ioMananger = ioMananger ?? throw new ArgumentNullException(nameof(ioMananger));
122  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
123  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
124  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
125  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
126  IsGitHubRepository = Origin.Contains(GitHubUrl, StringComparison.InvariantCultureIgnoreCase);
127  if (IsGitHubRepository)
128  {
129  GetRepositoryOwnerName(Origin, out var owner, out var name);
130  GitHubOwner = owner;
131  GitHubRepoName = name;
132  }
133  }
134 
136  public void Dispose()
137  {
138  logger.LogTrace("Disposing...");
139  repository.Dispose();
140  onDispose.Invoke();
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  public async Task<bool?> AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action<int> progressReporter, CancellationToken cancellationToken)
194  {
195  if (testMergeParameters == null)
196  throw new ArgumentNullException(nameof(testMergeParameters));
197  if (committerName == null)
198  throw new ArgumentNullException(nameof(committerName));
199  if (committerEmail == null)
200  throw new ArgumentNullException(nameof(committerEmail));
201  if (progressReporter == null)
202  throw new ArgumentNullException(nameof(progressReporter));
203 
204  logger.LogDebug("Begin AddTestMerge: #{0} at {1} ({4}) by <{2} ({3})>", testMergeParameters.Number, testMergeParameters.PullRequestRevision?.Substring(0, 7), committerName, committerEmail, testMergeParameters.Comment);
205 
206  if (!IsGitHubRepository)
207  throw new InvalidOperationException("Test merging is only available on GitHub hosted origin repositories!");
208 
209  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);
210 
211  var prBranchName = String.Format(CultureInfo.InvariantCulture, "pr-{0}", testMergeParameters.Number);
212  var localBranchName = String.Format(CultureInfo.InvariantCulture, "pull/{0}/headrefs/heads/{1}", testMergeParameters.Number, prBranchName);
213 
214  var refSpec = String.Format(CultureInfo.InvariantCulture, "pull/{0}/head:{1}", testMergeParameters.Number, prBranchName);
215  var refSpecList = new List<string> { refSpec };
216  var logMessage = String.Format(CultureInfo.InvariantCulture, "Merge remote pull request #{0}", testMergeParameters.Number);
217 
218  var originalCommit = repository.Head;
219 
220  MergeResult result = null;
221 
222  var sig = new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now);
223  await Task.Factory.StartNew(() =>
224  {
225  try
226  {
227  try
228  {
229  logger.LogTrace("Fetching refspec {0}...", refSpec);
230 
231  var remote = repository.Network.Remotes.First();
232  progressReporter(0);
233  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, refSpecList, new FetchOptions
234  {
235  Prune = true,
236  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
237  OnTransferProgress = (a) =>
238  {
239  var percentage = 50 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
240  progressReporter((int)percentage);
241  return !cancellationToken.IsCancellationRequested;
242  },
243  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
244  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
245  }, logMessage);
246  }
247  catch (UserCancelledException) { }
248 
249  cancellationToken.ThrowIfCancellationRequested();
250 
251  repository.RemoveUntrackedFiles();
252 
253  cancellationToken.ThrowIfCancellationRequested();
254 
255  testMergeParameters.PullRequestRevision = repository.Lookup(testMergeParameters.PullRequestRevision ?? localBranchName).Sha;
256 
257  cancellationToken.ThrowIfCancellationRequested();
258 
259  logger.LogTrace("Merging {0} into {1}...", testMergeParameters.PullRequestRevision.Substring(0, 7), Reference);
260 
261  result = repository.Merge(testMergeParameters.PullRequestRevision, sig, new MergeOptions
262  {
263  CommitOnSuccess = commitMessage == null,
264  FailOnConflict = true,
265  FastForwardStrategy = FastForwardStrategy.NoFastForward,
266  SkipReuc = true,
267  OnCheckoutProgress = (a, completedSteps, totalSteps) => progressReporter(50 + ((int)((((float)completedSteps) / totalSteps) * 50)))
268  });
269  }
270  finally
271  {
272  repository.Branches.Remove(localBranchName);
273  }
274 
275  cancellationToken.ThrowIfCancellationRequested();
276 
277  if (result.Status == MergeStatus.Conflicts)
278  {
279  var revertTo = originalCommit.CanonicalName ?? originalCommit.Tip.Sha;
280  logger.LogDebug("Merge conflict, aborting and reverting to {0}", revertTo);
281  RawCheckout(revertTo, progressReporter, cancellationToken);
282  cancellationToken.ThrowIfCancellationRequested();
283  }
284 
285  repository.RemoveUntrackedFiles();
286  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
287 
288  if (result.Status == MergeStatus.Conflicts)
289  {
290  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { originalCommit.Tip.Sha, testMergeParameters.PullRequestRevision, originalCommit.FriendlyName ?? UnknownReference, prBranchName }, cancellationToken).ConfigureAwait(false);
291  return null;
292  }
293 
294  if (commitMessage != null && result.Status != MergeStatus.UpToDate)
295  {
296  logger.LogTrace("Committing merge: \"{0}\"...", commitMessage);
297  await Task.Factory.StartNew(() => repository.Commit(commitMessage, sig, sig, new CommitOptions
298  {
299  PrettifyMessage = true
300  }), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
301  }
302 
303  await eventConsumer.HandleEvent(EventType.RepoMergePullRequest, new List<string> { testMergeParameters.Number.ToString(), testMergeParameters.PullRequestRevision, testMergeParameters.Comment }, cancellationToken).ConfigureAwait(false);
304 
305  return result.Status != MergeStatus.NonFastForward;
306  }
307 
309  public async Task CheckoutObject(string committish, Action<int> progressReporter, CancellationToken cancellationToken)
310  {
311  if (committish == null)
312  throw new ArgumentNullException(nameof(committish));
313  if (progressReporter == null)
314  throw new ArgumentNullException(nameof(progressReporter));
315  logger.LogDebug("Checkout object: {0}...", committish);
316  await eventConsumer.HandleEvent(EventType.RepoCheckout, new List<string> { committish }, cancellationToken).ConfigureAwait(false);
317  await Task.Factory.StartNew(() =>
318  {
319  repository.RemoveUntrackedFiles();
320  RawCheckout(committish, progressReporter, cancellationToken);
321  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
322  }
323 
325  public async Task FetchOrigin(string username, string password, Action<int> progressReporter, CancellationToken cancellationToken)
326  {
327  if (progressReporter == null)
328  throw new ArgumentNullException(nameof(progressReporter));
329  logger.LogDebug("Fetch origin...");
330  await eventConsumer.HandleEvent(EventType.RepoFetch, Array.Empty<string>(), cancellationToken).ConfigureAwait(false);
331  await Task.Factory.StartNew(() =>
332  {
333  var remote = repository.Network.Remotes.First();
334  try
335  {
336  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, remote.FetchRefSpecs.Select(x => x.Specification), new FetchOptions
337  {
338  Prune = true,
339  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
340  OnTransferProgress = (a) =>
341  {
342  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
343  progressReporter((int)percentage);
344  return !cancellationToken.IsCancellationRequested;
345  },
346  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
347  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
348  }, "Fetch origin commits");
349  }
350  catch (UserCancelledException)
351  {
352  cancellationToken.ThrowIfCancellationRequested();
353  }
354  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
355  }
356 
365  Task PushHeadToTemporaryBranch(string username, string password, Action<int> progressReporter, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
366  {
367  logger.LogInformation("Pushing changes to temporary remote branch...");
368  var branch = repository.CreateBranch(RemoteTemporaryBranchName);
369  try
370  {
371  cancellationToken.ThrowIfCancellationRequested();
372  var remote = repository.Network.Remotes.First();
373  try
374  {
375  var forcePushString = String.Format(CultureInfo.InvariantCulture, "+{0}:{0}", branch.CanonicalName);
376  repository.Network.Push(remote,forcePushString, GeneratePushOptions(progress => progressReporter((int)(0.9f * progress)), username, password, cancellationToken));
377  var removalString = String.Format(CultureInfo.InvariantCulture, ":{0}", branch.CanonicalName);
378  repository.Network.Push(remote, removalString, GeneratePushOptions(progress => progressReporter(90 + (int)(0.1f * progress)), username, password, cancellationToken));
379  }
380  catch (UserCancelledException)
381  {
382  cancellationToken.ThrowIfCancellationRequested();
383  }
384  catch(LibGit2SharpException e)
385  {
386  logger.LogWarning("Unable to push to temporary branch! Exception: {0}", e);
387  }
388  }
389  finally
390  {
391  repository.Branches.Remove(branch);
392  }
393  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
394 
396  public async Task ResetToOrigin(Action<int> progressReporter, CancellationToken cancellationToken)
397  {
398  if (progressReporter == null)
399  throw new ArgumentNullException(nameof(progressReporter));
400  if (!Tracking)
401  throw new JobException("Cannot reset to origin while not on a tracked reference!");
402  logger.LogTrace("Reset to origin...");
403  var trackedBranch = repository.Head.TrackedBranch;
404  await eventConsumer.HandleEvent(EventType.RepoResetOrigin, new List<string> { trackedBranch.FriendlyName, trackedBranch.Tip.Sha }, cancellationToken).ConfigureAwait(false);
405  await ResetToSha(trackedBranch.Tip.Sha, progressReporter, cancellationToken).ConfigureAwait(false);
406  }
407 
409  public Task ResetToSha(string sha, Action<int> progressReporter, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
410  {
411  if (sha == null)
412  throw new ArgumentNullException(nameof(sha));
413  if (progressReporter == null)
414  throw new ArgumentNullException(nameof(progressReporter));
415 
416  logger.LogDebug("Reset to sha: {0}", sha.Substring(0, 7));
417 
418  repository.RemoveUntrackedFiles();
419  cancellationToken.ThrowIfCancellationRequested();
420 
421  var gitObject = repository.Lookup(sha, ObjectType.Commit);
422  cancellationToken.ThrowIfCancellationRequested();
423 
424  if (gitObject == null)
425  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot reset to non-existent SHA: {0}", sha));
426 
427  repository.Reset(ResetMode.Hard, gitObject.Peel<Commit>(), new CheckoutOptions
428  {
429  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
430  });
431  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
432 
434  public async Task CopyTo(string path, CancellationToken cancellationToken)
435  {
436  if (path == null)
437  throw new ArgumentNullException(nameof(path));
438  logger.LogTrace("Copying to {0}...", path);
439  await ioMananger.CopyDirectory(".", path, new List<string> { ".git" }, cancellationToken).ConfigureAwait(false);
440  }
441 
443  public async Task<bool?> MergeOrigin(string committerName, string committerEmail, Action<int> progressReporter, CancellationToken cancellationToken)
444  {
445  if (progressReporter == null)
446  throw new ArgumentNullException(nameof(progressReporter));
447 
448  MergeResult result = null;
449  Branch trackedBranch = null;
450 
451  var oldHead = repository.Head;
452  var oldTip = oldHead.Tip;
453 
454  await Task.Factory.StartNew(() =>
455  {
456  if (!Tracking)
457  throw new JobException("Cannot reset to origin while not on a tracked reference!");
458 
459  repository.RemoveUntrackedFiles();
460 
461  cancellationToken.ThrowIfCancellationRequested();
462 
463  trackedBranch = repository.Head.TrackedBranch;
464  logger.LogDebug("Merge origin/{2}: <{0} ({1})>", committerName, committerEmail, trackedBranch.FriendlyName);
465  result = repository.Merge(trackedBranch, new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now), new MergeOptions
466  {
467  CommitOnSuccess = true,
468  FailOnConflict = true,
469  FastForwardStrategy = FastForwardStrategy.Default,
470  SkipReuc = true,
471  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
472  });
473 
474  cancellationToken.ThrowIfCancellationRequested();
475 
476  if (result.Status == MergeStatus.Conflicts)
477  {
478  logger.LogDebug("Merge conflict, aborting and reverting to {0}", oldHead.FriendlyName);
479  repository.Reset(ResetMode.Hard, oldTip, new CheckoutOptions
480  {
481  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
482  });
483  cancellationToken.ThrowIfCancellationRequested();
484  }
485 
486  repository.RemoveUntrackedFiles();
487  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
488 
489  if (result.Status == MergeStatus.Conflicts)
490  {
491  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { oldTip.Sha, trackedBranch.Tip.Sha, oldHead.FriendlyName ?? UnknownReference, trackedBranch.FriendlyName }, cancellationToken).ConfigureAwait(false);
492  return null;
493  }
494 
495  return result.Status == MergeStatus.FastForward;
496  }
497 
499  public async Task<bool> Sychronize(string username, string password, string committerName, string committerEmail, Action<int> progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)
500  {
501  if (committerName == null)
502  throw new ArgumentNullException(nameof(committerName));
503  if (committerEmail == null)
504  throw new ArgumentNullException(nameof(committerEmail));
505  if (progressReporter == null)
506  throw new ArgumentNullException(nameof(progressReporter));
507 
508  if (username == null && password == null)
509  {
510  logger.LogTrace("Not synchronizing due to lack of credentials!");
511  return false;
512  }
513  logger.LogTrace("Begin Synchronize...");
514 
515  if (username == null)
516  throw new ArgumentNullException(nameof(username));
517  if (password == null)
518  throw new ArgumentNullException(nameof(password));
519 
520  var startHead = Head;
521 
522  logger.LogTrace("Configuring <{0} ({1})> as author/committer", committerName, committerEmail);
523  await Task.Factory.StartNew(() =>
524  {
525  repository.Config.Set("user.name", committerName);
526  cancellationToken.ThrowIfCancellationRequested();
527  repository.Config.Set("user.email", committerEmail);
528  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
529 
530  cancellationToken.ThrowIfCancellationRequested();
531  try
532  {
533  if (!await eventConsumer.HandleEvent(EventType.RepoPreSynchronize, new List<string> { ioMananger.ResolvePath(".") }, cancellationToken).ConfigureAwait(false))
534  {
535  logger.LogDebug("Aborted synchronize due to event handler response!");
536  return false;
537  }
538  }
539  finally
540  {
541  logger.LogTrace("Resetting and cleaning untracked files...");
542  await Task.Factory.StartNew(() =>
543  {
544  repository.RemoveUntrackedFiles();
545  cancellationToken.ThrowIfCancellationRequested();
546  repository.Reset(ResetMode.Hard, repository.Head.Tip, new CheckoutOptions
547  {
548  OnCheckoutProgress = CheckoutProgressHandler(progress => progressReporter(progress / 10))
549  });
550  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
551  }
552 
553  void FinalReporter(int progress) => progressReporter((int)(((float)progress) / 100 * 90));
554 
555  if (!synchronizeTrackedBranch)
556  {
557  await PushHeadToTemporaryBranch(username, password, FinalReporter, cancellationToken).ConfigureAwait(false);
558  return false;
559  }
560 
561  var sameHead = Head == startHead;
562  if (sameHead || !Tracking)
563  {
564  logger.LogTrace("Aborted synchronize due to {0}!", sameHead ? "lack of changes" : "not being on tracked reference");
565  return false;
566  }
567 
568  logger.LogInformation("Synchronizing with origin...");
569 
570  return await Task.Factory.StartNew(() =>
571  {
572  var remote = repository.Network.Remotes.First();
573  try
574  {
575  repository.Network.Push(repository.Head, GeneratePushOptions(FinalReporter, username, password, cancellationToken));
576  return true;
577  }
578  catch (NonFastForwardException)
579  {
580  logger.LogInformation("Synchronize aborted, non-fast forward!");
581  return false;
582  }
583  catch (UserCancelledException e)
584  {
585  cancellationToken.ThrowIfCancellationRequested();
586  throw new InvalidOperationException("Caught UserCancelledException without cancellationToken triggering", e);
587  }
588  catch (LibGit2SharpException e)
589  {
590  logger.LogWarning("Unable to make synchronization push! Exception: {0}", e);
591  return false;
592  }
593  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
594  }
595 
597  public Task<bool> IsSha(string committish, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
598  {
599  //check if it's a tag
600  var gitObject = repository.Lookup(committish, ObjectType.Tag);
601  if (gitObject != null)
602  return false;
603  cancellationToken.ThrowIfCancellationRequested();
604  //check if it's a branch
605  if (repository.Branches[committish] != null)
606  return false;
607  cancellationToken.ThrowIfCancellationRequested();
608  //err on the side of references, if we can't look it up, assume its a reference
609  if (repository.Lookup<Commit>(committish) != null)
610  return true;
611  return false;
612  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
613  }
614 }
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:309
+
readonly IIOManager ioMananger
The IIOManager for the Repository
Definition: Repository.cs:65
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
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:443
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the Repository
Definition: Repository.cs:75
+
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:118
+
async Task CopyTo(string path, CancellationToken cancellationToken)
Copies the current working directory to a given path
Definition: Repository.cs:434
+ +
int Number
The number of the pull request
+ +
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
+ +
Represents a git repository
Definition: Repository.cs:8
+
void GetRepositoryOwnerName(string remote, out string owner, out string name)
Definition: Repository.cs:87
+ + +
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:193
+
Parameters for creating a TestMerge
+
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:396
+
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:499
+
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
async Task FetchOrigin(string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Fetch commits from the origin repository
Definition: Repository.cs:325
+
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
+
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..b1bd45e083 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..58b6f0b9a0 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Models
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(),
33  ConnectionString = ConnectionString,
34  Enabled = Enabled,
35  Provider = Provider,
36  Id = Id,
37  Name = Name
38  };
39  }
40 }
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ + + +
+ + + + 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..efdb7a3d65 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..d29e0ef524 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
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  {
29  DiscordChannelId = DiscordChannelId,
30  IsAdminChannel = IsAdminChannel,
31  IsWatchdogChannel = IsWatchdogChannel,
32  IsUpdatesChannel = IsUpdatesChannel,
33  IrcChannel = IrcChannel,
34  Tag = Tag
35  };
36  }
37 }
+ + + + + + +
+ + + + 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..c0b047cb34 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..3936a7cc0c --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Models
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  {
38  DirectoryName = DirectoryName,
39  DmeName = DmeName,
40  Id = Id,
41  Job = Job.ToApi(),
42  Output = Output,
43  RevisionInformation = RevisionInformation.ToApi(),
44  ByondVersion = Version.Parse(ByondVersion),
45  MinimumSecurityLevel = MinimumSecurityLevel
46  };
47  }
48 }
+ + + +
Api.Models.RevisionInformation ToApi()
Convert the RevisionInformation to it&#39;s API form
+
Api.Models.Job ToApi()
Convert the Job to it&#39;s API form
+ + +
+ + + + 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..73a10752e5 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DreamDaemonSettings.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonSettings.cs File Reference
+
+ + + + + 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..22d4515fe0 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
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 }
+ + +
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..ff68971f33 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..6396ce3e0c --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
4 {
8  public sealed class Instance : Api.Models.Instance
9  {
10 
15 
20 
25 
30 
34  public List<InstanceUser> InstanceUsers { get; set; }
35 
39  public List<ChatBot> ChatSettings { get; set; }
40 
44  public List<RevisionInformation> RevisionInformations { get; set; }
45 
49  public List<Job> Jobs { get; set; }
50 
55  public Api.Models.Instance ToApi() => new Api.Models.Instance
56  {
57  AutoUpdateInterval = AutoUpdateInterval,
59  Id = Id,
60  Name = Name,
61  Path = Path,
62  Online = Online
63  };
64  }
65 }
+ +
Database representation of Components.Watchdog.WatchdogReattachInformation
+ + + +
ConfigurationType
The type of configuration allowed on an 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_user_8cs.html b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html new file mode 100644 index 0000000000..8851566c61 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/InstanceUser.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceUser.cs File Reference
+
+ + + + + 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..4369eab401 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
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 }
ConfigurationRights
Rights for Models.ConfigurationFile
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
InstanceUserRights
Rights for an Models.Instance
+ + +
DreamDaemonRights
Rights for Models.DreamDaemon
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
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_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..c9b1c1f8d4 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_job_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..3bc28444fb --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_job_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Models
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,
43  StartedAt = StartedAt,
44  StoppedAt = StoppedAt,
45  Cancelled = Cancelled,
46  CancelledBy = CancelledBy?.ToApi(false),
47  CancelRight = CancelRight,
48  CancelRightsType = CancelRightsType,
49  Description = Description,
50  ExceptionDetails = ExceptionDetails,
51  StartedBy = StartedBy.ToApi(false)
52  };
53  }
54 }
+ + +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
Api.Models.Instance ToApi()
Convert the Instance to it&#39;s API form
+ +
+ + + + 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..2d4e4ab966 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RepositorySettings.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositorySettings.cs File Reference
+
+ + + + + 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..a9e4a5d005 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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;
2 using System.ComponentModel.DataAnnotations;
4 
5 namespace Tgstation.Server.Host.Models
6 {
8  public sealed class RepositorySettings : Api.Models.Internal.RepositorySettings
9  {
13  public long Id { get; set; }
14 
18  public long InstanceId { get; set; }
19 
23  [Required]
24  public Instance Instance { get; set; }
25 
30  public Repository ToApi() => new Repository
31  {
32  //AccessToken = AccessToken, //never show this
33  AccessUser = AccessUser,
34  AutoUpdatesKeepTestMerges = AutoUpdatesKeepTestMerges,
35  AutoUpdatesSynchronize = AutoUpdatesSynchronize,
36  CommitterEmail = CommitterEmail,
37  CommitterName = CommitterName,
38  PushTestMergeCommits = PushTestMergeCommits,
39  ShowTestMergeCommitters = ShowTestMergeCommitters
40  //revision information and the rest retrieved by controller
41  };
42  }
43 }
+ + + + +
Represents a git repository
Definition: Repository.cs:8
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ + +
+ + + + 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..f80eb27939 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RevisionInformation.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RevisionInformation.cs File Reference
+
+ + + + + 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..7f69038b38 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Models
6 {
8  public sealed class RevisionInformation : Api.Models.Internal.RevisionInformation
9  {
13  public long Id { get; set; }
14 
18  [Required]
19  public Instance Instance { get; set; }
20 
24  public TestMerge PrimaryTestMerge { get; set; }
25 
29  public List<RevInfoTestMerge> ActiveTestMerges { get; set; }
30 
34  public List<CompileJob> CompileJobs { get; set; }
35 
40  public Api.Models.RevisionInformation ToApi() => new Api.Models.RevisionInformation
41  {
42  CommitSha = CommitSha,
43  OriginCommitSha = OriginCommitSha,
44  PrimaryTestMerge = PrimaryTestMerge?.ToApi(),
45  ActiveTestMerges = ActiveTestMerges.Select(x => x.TestMerge.ToApi()).ToList(),
46  CompileJobs = CompileJobs.Select(x => new Api.Models.CompileJob
47  {
48  Id = x.Id //anti recursion measure
49  }).ToList()
50  };
51  }
52 }
+ + +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ + +
+ + + + 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..f26301da0b --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..c0aeba91d7 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Models
5 {
7  public sealed class TestMerge : Api.Models.Internal.TestMerge
8  {
12  [Required]
13  public User MergedBy { get; set; }
14 
18  [Required]
19  public RevisionInformation PrimaryRevisionInformation { get; set; }
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,
38  BodyAtMerge = BodyAtMerge,
39  MergedAt = MergedAt,
40  TitleAtMerge = TitleAtMerge,
41  Comment = Comment,
42  Id = Id,
43  MergedBy = MergedBy.ToApi(false),
44  Number = Number,
45  PullRequestRevision = PullRequestRevision,
46  Url = Url
47  };
48  }
49 }
+ + + +
Api.Models.RevisionInformation ToApi()
Convert the RevisionInformation to it&#39;s API form
+ + +
+ + + + 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..a3e693377a --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_user_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.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..adb1f3435c --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_user_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
5 namespace Tgstation.Server.Host.Models
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,
55  CreatedAt = CreatedAt,
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 }
+ +
AdministrationRights
Rights for Models.Administration
+ +
InstanceManagerRights
Rights for managing Models.Instances
+ +
+ + + + 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..df4548a1f4 --- /dev/null +++ b/_tgstation_8_server_8_host_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Release/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..a3055d9d63 --- /dev/null +++ b/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Release/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("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.3")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.3")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.3")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+
+ + + + 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..466f488683 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Release/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..b22daa9bae --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Release/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("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.3")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.3")]
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.3")]
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..526c7344eb --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/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..76fc39106d --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/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("Release")]
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..476178b5d9 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs.html @@ -0,0 +1,113 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/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..37466fca50 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/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..3203ae4cf7 --- /dev/null +++ b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Release/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..c53270b03d --- /dev/null +++ b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Release/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_tests_2_components_2_watchdog_2_test_watchdog_8cs.html b/_tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_8cs.html new file mode 100644 index 0000000000..982b5dad6c --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestWatchdog.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestWatchdog.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_8cs_source.html b/_tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_8cs_source.html new file mode 100644 index 0000000000..b8530ab7fe --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_8cs_source.html @@ -0,0 +1,126 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestWatchdog.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestWatchdog.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 
14 namespace Tgstation.Server.Host.Components.Watchdog.Tests
15 {
16  [TestClass]
17  public sealed class TestWatchdog
18  {
19  [TestMethod]
20  public void TestConstruction()
21  {
22  Assert.ThrowsException<ArgumentNullException>(() => new Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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<Watchdog>>();
59  Assert.ThrowsException<ArgumentNullException>(() => new Watchdog(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 Watchdog(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 Watchdog(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<Watchdog>>();
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 Watchdog(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
+ + + + + + + + + + + + + +
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+ + + + + + +
+ + + + 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..b50f09579f --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/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..4e22852711 --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/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("Release")]
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..6835fdf4aa --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_program_8cs.html @@ -0,0 +1,113 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/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..bd9abbdcce --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/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_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html new file mode 100644 index 0000000000..33f02c41de --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release/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..10d748ad08 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release/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("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.3")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.3")]
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.3")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+
+ + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_2_test_watchdog_8cs.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_2_test_watchdog_8cs.html new file mode 100644 index 0000000000..33aa28d506 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_2_test_watchdog_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/TestWatchdog.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestWatchdog.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_2_test_watchdog_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_2_test_watchdog_8cs_source.html new file mode 100644 index 0000000000..a7a8311e44 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_2_test_watchdog_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
8 namespace Tgstation.Server.Host.Watchdog.Tests
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/_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..88df0617e3 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/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..6b02753515 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/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("Release")]
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..71a5ad72e5 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs.html @@ -0,0 +1,113 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/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..05521465ef --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/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..6ffe9f992d --- /dev/null +++ b/_tgstation_8_server_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Release/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..4ac2885489 --- /dev/null +++ b/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Release/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("Release")]
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..a18a31b767 --- /dev/null +++ b/_tgstation_8_server_8_tests_8_program_8cs.html @@ -0,0 +1,113 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Release/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..ba2161b75f --- /dev/null +++ b/_tgstation_8_server_8_tests_8_program_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Release/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..803b3f6e78 --- /dev/null +++ b/_token_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Models
 
+
+ + + + diff --git a/_token_8cs_source.html b/_token_8cs_source.html new file mode 100644 index 0000000000..fe501e99a6 --- /dev/null +++ b/_token_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Api.Models
4 {
8  public sealed class Token
9  {
13  public string Bearer { get; set; }
14 
18  public DateTimeOffset? ExpiresAt { get; set; }
19  }
20 }
+ +
Represents a JWT returned by the API
Definition: Token.cs:8
+ +
+ + + + diff --git a/_token_factory_8cs.html b/_token_factory_8cs.html new file mode 100644 index 0000000000..2b486eac68 --- /dev/null +++ b/_token_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/TokenFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TokenFactory.cs File Reference
+
+ + + + + diff --git a/_token_factory_8cs_source.html b/_token_factory_8cs_source.html new file mode 100644 index 0000000000..12e32a4f96 --- /dev/null +++ b/_token_factory_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + +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 
12 namespace Tgstation.Server.Host.Security
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 
45  public TokenFactory(IAsyncDelayer asyncDelayer, ICryptographySuite cryptographySuite)
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 
77  var nowUnix = now.ToUnixTimeSeconds();
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
+ + +
Contains various cryptographic functions
+ + +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the TokenFactory
Definition: TokenFactory.cs:38
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
TokenFactory(IAsyncDelayer asyncDelayer, ICryptographySuite cryptographySuite)
Construct a TokenFactory
Definition: TokenFactory.cs:45
+ + +
async Task< Token > CreateToken(Models.User user, CancellationToken cancellationToken)
Create a Token for a given user
Definition: TokenFactory.cs:70
+ + + +
+ + + + diff --git a/_unauthorized_exception_8cs.html b/_unauthorized_exception_8cs.html new file mode 100644 index 0000000000..f1803160c4 --- /dev/null +++ b/_unauthorized_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_unauthorized_exception_8cs_source.html b/_unauthorized_exception_8cs_source.html new file mode 100644 index 0000000000..c5a3883af0 --- /dev/null +++ b/_unauthorized_exception_8cs_source.html @@ -0,0 +1,116 @@ + + + + + + +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 
5 namespace Tgstation.Server.Client
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..0df6d9fc82 --- /dev/null +++ b/_unrecognized_response_exception_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_unrecognized_response_exception_8cs_source.html b/_unrecognized_response_exception_8cs_source.html new file mode 100644 index 0000000000..38362a183b --- /dev/null +++ b/_unrecognized_response_exception_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + +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 
6 namespace Tgstation.Server.Client
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..4eb0745508 --- /dev/null +++ b/_updates_configuration_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Configuration
 
+
+ + + + diff --git a/_updates_configuration_8cs_source.html b/_updates_configuration_8cs_source.html new file mode 100644 index 0000000000..e33c1f3dc9 --- /dev/null +++ b/_updates_configuration_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Host.Configuration
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 
41  public string UpdatePackageAssetName { get; set; } = DefaultUpdatePackageAssetName;
42  }
43 }
+
Configuration for the automatic update system
+ + +
+ + + + diff --git a/_user_controller_8cs.html b/_user_controller_8cs.html new file mode 100644 index 0000000000..47de77cd57 --- /dev/null +++ b/_user_controller_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Host.Controllers
 
+
+ + + + diff --git a/_user_controller_8cs_source.html b/_user_controller_8cs_source.html new file mode 100644 index 0000000000..5eb9a5a6f1 --- /dev/null +++ b/_user_controller_8cs_source.html @@ -0,0 +1,148 @@ + + + + + + +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 
19 namespace Tgstation.Server.Host.Controllers
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
+ + + + + + +
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)
+
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
+ +
For editing a given User. Will never be returned by the API
Definition: UserUpdate.cs:6
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
bool Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled ...
Definition: User.cs:21
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + + +
AdministrationRights AdministrationRights
The Rights.AdministrationRights for the User
Definition: User.cs:44
+
+ + + + diff --git a/_user_update_8cs.html b/_user_update_8cs.html new file mode 100644 index 0000000000..8c418e1bc8 --- /dev/null +++ b/_user_update_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.Server.Api.Models
 
+
+ + + + diff --git a/_user_update_8cs_source.html b/_user_update_8cs_source.html new file mode 100644 index 0000000000..de77efa232 --- /dev/null +++ b/_user_update_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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.
1 namespace Tgstation.Server.Api.Models
2 {
6  public sealed class UserUpdate : User
7  {
11  public string Password { get; set; }
12  }
13 }
+ +
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..97b4180d60 --- /dev/null +++ b/_users_client_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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.Server.Client
 
+
+ + + + diff --git a/_users_client_8cs_source.html b/_users_client_8cs_source.html new file mode 100644 index 0000000000..191249b8ad --- /dev/null +++ b/_users_client_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
8 namespace Tgstation.Server.Client
9 {
11  sealed class UsersClient : IUsersClient
12  {
17 
22  public UsersClient(IApiClient apiClient)
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
+ + + + + +
Routes to a server actions
Definition: Routes.cs:9
+ + +
long Id
The ID of the User
Definition: User.cs:15
+
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
+ +
+ + + + diff --git a/_version_command_8cs.html b/_version_command_8cs.html new file mode 100644 index 0000000000..a712cce6ac --- /dev/null +++ b/_version_command_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..e61ede237e --- /dev/null +++ b/_version_command_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + +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 
6 namespace Tgstation.Server.Host.Components.Chat.Commands
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 
31  public VersionCommand(IApplication application)
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
+
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/_watchdog_2_i_watchdog_8cs.html b/_watchdog_2_i_watchdog_8cs.html new file mode 100644 index 0000000000..aa3e8ad079 --- /dev/null +++ b/_watchdog_2_i_watchdog_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..179b142963 --- /dev/null +++ b/_watchdog_2_i_watchdog_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Watchdog
5 {
9  public interface IWatchdog
10  {
18  Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken);
19  }
20 }
+ +
The watchdog for a Host
Definition: IWatchdog.cs:9
+ + +
+ + + + diff --git a/_watchdog_2_i_watchdog_factory_8cs.html b/_watchdog_2_i_watchdog_factory_8cs.html new file mode 100644 index 0000000000..2fda7cf915 --- /dev/null +++ b/_watchdog_2_i_watchdog_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..2a91771db1 --- /dev/null +++ b/_watchdog_2_i_watchdog_factory_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Watchdog
4 {
8  public interface IWatchdogFactory
9  {
15  IWatchdog CreateWatchdog(ILoggerFactory loggerFactory);
16  }
17 }
+
The watchdog for a Host
Definition: IWatchdog.cs:9
+ + +
+ + + + diff --git a/_watchdog_2_watchdog_8cs.html b/_watchdog_2_watchdog_8cs.html new file mode 100644 index 0000000000..b59fe13fe0 --- /dev/null +++ b/_watchdog_2_watchdog_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/Watchdog.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Watchdog.cs File Reference
+
+ + + + + diff --git a/_watchdog_2_watchdog_8cs_source.html b/_watchdog_2_watchdog_8cs_source.html new file mode 100644 index 0000000000..d09726a134 --- /dev/null +++ b/_watchdog_2_watchdog_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + +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 
13 namespace Tgstation.Server.Host.Watchdog
14 {
16  sealed class Watchdog : IWatchdog
17  {
18 
22  readonly ILogger<Watchdog> logger;
23 
28  public Watchdog(ILogger<Watchdog> logger)
29  {
30  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
31  }
32 
34  public async Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
35  {
36  logger.LogInformation("Host watchdog starting...");
37  logger.LogDebug("PID: {0}", Process.GetCurrentProcess().Id);
38  string updateDirectory = null;
39  try
40  {
41  var enviromentPath = Environment.GetEnvironmentVariable("PATH");
42  var paths = enviromentPath.Split(';');
43  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
44 
45  var exeName = "dotnet";
46  IEnumerable<string> enumerator;
47  if (isWindows)
48  {
49  exeName += ".exe";
50  enumerator = paths;
51  }
52  else
53  enumerator = paths.Select(x => x.Split(':')).SelectMany(x => x);
54 
55  enumerator = enumerator.Select(x => Path.Combine(x, exeName));
56 
57  var dotnetPath = enumerator
58  .Where(x =>
59  {
60  logger.LogTrace("Checking for dotnet at {0}", x);
61  return File.Exists(x);
62  })
63  .FirstOrDefault();
64 
65  if (dotnetPath == default)
66  {
67  logger.LogCritical("Unable to locate dotnet executable in PATH! Please ensure the .NET Core runtime is installed and is in your PATH!");
68  return;
69  }
70  logger.LogInformation("Detected dotnet executable at {0}", dotnetPath);
71 
72  var rootLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
73 
74  var assemblyStoragePath = Path.Combine(rootLocation, "lib"); //always always next to watchdog
75 #if DEBUG
76  Directory.CreateDirectory(assemblyStoragePath);
77 #endif
78  var defaultAssemblyPath = Path.GetFullPath(Path.Combine(assemblyStoragePath, "Default"));
79 #if DEBUG
80  //just copy the shit where it belongs
81  Directory.Delete(assemblyStoragePath, true);
82  Directory.CreateDirectory(defaultAssemblyPath);
83 
84  var sourcePath = "../../../Tgstation.Server.Host/bin/Debug/netcoreapp2.1";
85  foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
86  Directory.CreateDirectory(dirPath.Replace(sourcePath, defaultAssemblyPath));
87 
88  foreach (string newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories))
89  File.Copy(newPath, newPath.Replace(sourcePath, defaultAssemblyPath), true);
90 
91  const string AppSettingsJson = "appsettings.json";
92  var rootJson = Path.Combine(rootLocation, AppSettingsJson);
93  File.Delete(rootJson);
94  File.Move(Path.Combine(defaultAssemblyPath, AppSettingsJson), rootJson);
95 #endif
96 
97  var assemblyName = String.Join(".", nameof(Tgstation), nameof(Server), nameof(Host), "dll");
98  var assemblyPath = Path.Combine(defaultAssemblyPath, assemblyName);
99 
100  if (assemblyPath.Contains("\""))
101  {
102  logger.LogCritical("Running from paths with \"'s in the name is not supported!");
103  return;
104  }
105 
106  if (!File.Exists(assemblyPath))
107  {
108  logger.LogCritical("Unable to locate host assembly!");
109  return;
110  }
111 
112  while (!cancellationToken.IsCancellationRequested)
113  using (logger.BeginScope("Host invocation"))
114  {
115  updateDirectory = Path.GetFullPath(Path.Combine(assemblyStoragePath, Guid.NewGuid().ToString()));
116  logger.LogInformation("Update path set to {0}", updateDirectory);
117  using (var process = new Process())
118  {
119  process.StartInfo.FileName = dotnetPath;
120  process.StartInfo.WorkingDirectory = rootLocation; //for appsettings
121 
122  var arguments = new List<string>
123  {
124  '"' + assemblyPath + '"',
125  '"' + updateDirectory + '"'
126  };
127 
128  if (Environment.GetCommandLineArgs().Any(x => x == "--attach-host-debugger"))
129  arguments.Add("--attach-debugger");
130 
131  if (runConfigure)
132  {
133  logger.LogInformation("Running configuration check and wizard if necessary...");
134  arguments.Add("General:SetupWizardMode=Only");
135  }
136 
137  arguments.AddRange(args);
138 
139  process.StartInfo.Arguments = String.Join(" ", arguments);
140 
141  process.StartInfo.UseShellExecute = false; //runs in the same console
142 
143  var tcs = new TaskCompletionSource<object>();
144  process.Exited += (a, b) =>
145  {
146  tcs.TrySetResult(null);
147  };
148  process.EnableRaisingEvents = true;
149 
150  logger.LogInformation("Launching host...");
151 
152  var killedHostProcess = false;
153  try
154  {
155  process.Start();
156 
157  using (var processCts = new CancellationTokenSource())
158  using (processCts.Token.Register(() => tcs.TrySetResult(null)))
159  using (cancellationToken.Register(() =>
160  {
161  if (!Directory.Exists(updateDirectory))
162  {
163  logger.LogInformation("Cancellation requested! Writing shutdown lock file...");
164  File.WriteAllBytes(updateDirectory, Array.Empty<byte>());
165  }
166  else
167  logger.LogWarning("Cancellation requested while update directory exists!");
168 
169  logger.LogInformation("Will force close host process if it doesn't exit in 10 seconds...");
170 
171  try
172  {
173  processCts.CancelAfter(TimeSpan.FromSeconds(10));
174  }
175  catch (ObjectDisposedException) { } //race conditions
176  }))
177  await tcs.Task.ConfigureAwait(false);
178  }
179  catch (InvalidOperationException) { }
180  finally
181  {
182  try
183  {
184  if (!process.HasExited)
185  {
186  killedHostProcess = true;
187  process.Kill();
188  process.WaitForExit();
189  }
190  }
191  catch (InvalidOperationException) { }
192  logger.LogInformation("Host exited!");
193  }
194 
195  if (runConfigure)
196  {
197  logger.LogInformation("Exiting due to configuration check...");
198  return;
199  }
200 
201  switch (process.ExitCode)
202  {
203  case 0:
204  return;
205  case 1:
206  if (!cancellationToken.IsCancellationRequested)
207  //just a restart
208  logger.LogInformation("Watchdog will restart host...");
209  else
210  logger.LogWarning("Host requested restart but watchdog shutdown is in progress!");
211  break;
212  case 2:
213  //update path is now an exception document
214  logger.LogCritical("Host crashed, propagating exception dump...");
215  var data = File.ReadAllText(updateDirectory);
216  try
217  {
218  File.Delete(updateDirectory);
219  }
220  catch (Exception e)
221  {
222  logger.LogWarning("Unable to delete exception dump file at {0}! Exception: {1}", updateDirectory, e);
223  }
224  throw new Exception(String.Format(CultureInfo.InvariantCulture, "Host propagated exception: {0}", data));
225  default:
226  if (killedHostProcess)
227  {
228  logger.LogWarning("Watchdog forced to kill host process!");
229  cancellationToken.ThrowIfCancellationRequested();
230  }
231  throw new Exception(String.Format(CultureInfo.InvariantCulture, "Host crashed with exit code {0}!", process.ExitCode));
232  }
233  }
234 
235  //HEY YOU
236  //BE WARNED THAT IF YOU DEBUGGED THE HOST PROCESS THAT JUST LAUNCHED THE DEBUGGER WILL HOLD A LOCK ON THE DIRECTORY
237  //THIS MEANS THE FIRST DIRECTORY.MOVE WILL THROW
238  if (Directory.Exists(updateDirectory))
239  {
240  logger.LogInformation("Applying server update...");
241  if (isWindows)
242  {
243  //windows dick sucking resource unlocking
244  GC.Collect(Int32.MaxValue, GCCollectionMode.Default, true);
245  await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken).ConfigureAwait(false);
246  }
247  var tempPath = Path.Combine(assemblyStoragePath, Guid.NewGuid().ToString());
248  try
249  {
250  Directory.Move(defaultAssemblyPath, tempPath);
251  try
252  {
253  Directory.Move(updateDirectory, defaultAssemblyPath);
254  logger.LogInformation("Server update complete, deleting old server...");
255  try
256  {
257  Directory.Delete(tempPath, true);
258  }
259  catch (Exception e)
260  {
261  logger.LogWarning("Error deleting old server at {0}! Exception: {1}", tempPath, e);
262  }
263  }
264  catch (Exception e)
265  {
266  logger.LogError("Error moving updated server directory, attempting revert! Exception: {0}", e);
267  Directory.Delete(defaultAssemblyPath, true);
268  Directory.Move(tempPath, defaultAssemblyPath);
269  logger.LogInformation("Revert successful!");
270  }
271  }
272  catch (Exception e)
273  {
274  logger.LogWarning("Failed to move out active host assembly! Exception: {0}", e);
275  }
276  }
277  }
278  }
279  catch (OperationCanceledException)
280  {
281  logger.LogDebug("Exiting due to cancellation...");
282  if (!Directory.Exists(updateDirectory))
283  File.Delete(updateDirectory);
284  else
285  Directory.Delete(updateDirectory, true);
286  }
287  catch (Exception e)
288  {
289  logger.LogCritical("Watchdog error! Exception: {0}", e);
290  }
291  finally
292  {
293  logger.LogInformation("Host watchdog exiting...");
294  }
295  }
296  }
297 }
+ + + +
async Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
Definition: Watchdog.cs:34
+
readonly ILogger< Watchdog > logger
The ILogger for the Watchdog
Definition: Watchdog.cs:22
+
The watchdog for a Host
Definition: IWatchdog.cs:9
+ + +
Watchdog(ILogger< Watchdog > logger)
Construct a Watchdog
Definition: Watchdog.cs:28
+
+ + + + diff --git a/_watchdog_2_watchdog_factory_8cs.html b/_watchdog_2_watchdog_factory_8cs.html new file mode 100644 index 0000000000..2a177c00c6 --- /dev/null +++ b/_watchdog_2_watchdog_factory_8cs.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/WatchdogFactory.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogFactory.cs File Reference
+
+ + + + + diff --git a/_watchdog_2_watchdog_factory_8cs_source.html b/_watchdog_2_watchdog_factory_8cs_source.html new file mode 100644 index 0000000000..7d0289d563 --- /dev/null +++ b/_watchdog_2_watchdog_factory_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
4 namespace Tgstation.Server.Host.Watchdog
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 }
+ + +
The watchdog for a Host
Definition: IWatchdog.cs:9
+ + + +
+ + + + diff --git a/_watchdog_reattach_information_base_8cs.html b/_watchdog_reattach_information_base_8cs.html new file mode 100644 index 0000000000..51e9a5e0c2 --- /dev/null +++ b/_watchdog_reattach_information_base_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/WatchdogReattachInformationBase.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogReattachInformationBase.cs File Reference
+
+ + + + + diff --git a/_watchdog_reattach_information_base_8cs_source.html b/_watchdog_reattach_information_base_8cs_source.html new file mode 100644 index 0000000000..7f4da40ca0 --- /dev/null +++ b/_watchdog_reattach_information_base_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.Models
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..e87d0213b9 --- /dev/null +++ b/_windows_byond_installer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/WindowsByondInstaller.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WindowsByondInstaller.cs File Reference
+
+ + + + + diff --git a/_windows_byond_installer_8cs_source.html b/_windows_byond_installer_8cs_source.html new file mode 100644 index 0000000000..4e1e9c6fab --- /dev/null +++ b/_windows_byond_installer_8cs_source.html @@ -0,0 +1,132 @@ + + + + + + +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 
10 namespace Tgstation.Server.Host.Components.Byond
11 {
16  {
20  const string ByondRevisionsURL = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond.zip";
24  const string ByondConfigDir = "byond/cfg";
28  const string ByondDDConfig = "daemon.txt";
32  const string ByondNoPromptTrustedMode = "trusted-check 0";
36  const string ByondDXDir = "byond/directx";
37 
39  public string DreamDaemonName => "dreamdaemon.exe";
40 
42  public string DreamMakerName => "dm.exe";
43 
48 
53 
57  readonly ILogger<WindowsByondInstaller> logger;
58 
62  readonly SemaphoreSlim semaphore;
63 
68 
75  public WindowsByondInstaller(IIOManager ioManager, IProcessExecutor processExecutor, ILogger<WindowsByondInstaller> logger)
76  {
77  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
78  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
79  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
80 
81  semaphore = new SemaphoreSlim(1);
82  installedDirectX = false;
83  }
84 
86  public void Dispose() => semaphore.Dispose();
87 
89  public async Task CleanCache(CancellationToken cancellationToken)
90  {
91  try
92  {
93  await ioManager.DeleteDirectory(ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "byond/cache"), cancellationToken).ConfigureAwait(false);
94  }
95  catch(OperationCanceledException)
96  {
97  throw;
98  }
99  catch (Exception e)
100  {
101  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
102  }
103  }
104 
106  public Task<byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
107  {
108  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURL, version.Major, version.Minor);
109 
110  return ioManager.DownloadFile(new Uri(url), cancellationToken);
111  }
112 
114  public async Task InstallByond(string path, Version version, CancellationToken cancellationToken)
115  {
116  async Task SetNoPromptTrusted()
117  {
118  var configPath = ioManager.ConcatPath(path, ByondConfigDir);
119  await ioManager.CreateDirectory(configPath, cancellationToken).ConfigureAwait(false);
120  await ioManager.WriteAllBytes(ioManager.ConcatPath(configPath, ByondDDConfig), Encoding.UTF8.GetBytes(ByondNoPromptTrustedMode), cancellationToken).ConfigureAwait(false);
121  };
122 
123  var setNoPromptTrustedModeTask = SetNoPromptTrusted();
124 
125  //after this version lummox made DD depend of directx lol
126  //but then he became amazing and not only fixed it but also gave us 30s compiles \[T]/
127  if (version.Major == 512 && version.Minor >= 1427 && version.Minor < 1452 && !installedDirectX)
128  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
129  //check again because race conditions
130  if (!installedDirectX)
131  {
132  //always install it, it's pretty fast and will do better redundancy checking than us
133  var rbdx = ioManager.ConcatPath(path, ByondDXDir);
134  //noShellExecute because we aren't doing runas shennanigans
135  IProcess directXInstaller;
136  try
137  {
138  directXInstaller = processExecutor.LaunchProcess(ioManager.ConcatPath(rbdx, "DXSETUP.exe"), rbdx, "/silent", noShellExecute: true);
139  }
140  catch (Exception e)
141  {
142  throw new JobException("Unable to start DirectX installer process! Is the server running with admin privileges?", e);
143  }
144  using (directXInstaller)
145  {
146  int exitCode;
147  using (cancellationToken.Register(() => directXInstaller.Terminate()))
148  exitCode = await directXInstaller.Lifetime.ConfigureAwait(false);
149  cancellationToken.ThrowIfCancellationRequested();
150 
151  if (exitCode != 0)
152  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Failed to install included DirectX! Exit code: {0}", exitCode));
153  installedDirectX = true;
154  }
155  }
156 
157  await setNoPromptTrustedModeTask.ConfigureAwait(false);
158  }
159  }
160 }
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the WindowsByondInstaller
+ +
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
+
readonly ILogger< WindowsByondInstaller > logger
The ILogger for the WindowsByondInstaller
+ + + + + +
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
+
void Terminate()
Terminates the process
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
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
+ + +
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
+
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..261e00db0b --- /dev/null +++ b/_windows_network_prompt_reaper_8cs.html @@ -0,0 +1,119 @@ + + + + + + +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..0b0f7a8010 --- /dev/null +++ b/_windows_network_prompt_reaper_8cs_source.html @@ -0,0 +1,137 @@ + + + + + + +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.
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 
13 namespace Tgstation.Server.Host.Components.Watchdog
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);
73  NativeMethods.EnumWindowProc childProc = new NativeMethods.EnumWindowProc(EnumWindow);
74  NativeMethods.EnumChildWindows(main, childProc, pointerChildHandlesList);
75  }
76  finally
77  {
78  gcChildhandlesList.Free();
79  }
80  return childHandles;
81  }
82 
88  public WindowsNetworkPromptReaper(IAsyncDelayer asyncDelayer, ILogger<WindowsNetworkPromptReaper> logger)
89  {
90  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
91  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
92 
93  registeredProcesses = new List<IProcess>();
94  cancellationTokenSource = new CancellationTokenSource();
95  }
96 
98  public void Dispose() => cancellationTokenSource.Dispose();
99 
100  async Task Run(CancellationToken cancellationToken)
101  {
102  logger.LogDebug("Starting network prompt reaper...");
103  try
104  {
105  while (!cancellationToken.IsCancellationRequested)
106  {
107  await asyncDelayer.Delay(TimeSpan.FromMilliseconds(RecheckDelayMs), cancellationToken).ConfigureAwait(false);
108 
109  IntPtr window;
110  int processId;
111  lock (registeredProcesses)
112  {
113  if (registeredProcesses.Count == 0)
114  continue;
115 
116  window = NativeMethods.FindWindow(null, "Network Accessibility");
117  if (window == IntPtr.Zero)
118  continue;
119 
120  //found a bitch
121  var threadId = NativeMethods.GetWindowThreadProcessId(window, out processId);
122  if (!registeredProcesses.Any(x => x.Id == processId))
123  //not our bitch
124  continue;
125  }
126  logger.LogTrace("Identified \"Network Accessibility\" window in owned process {0}", processId);
127 
128  var found = false;
129  foreach (var I in GetAllChildHandles(window))
130  {
131  const int MaxLength = 10;
132  var stringBuilder = new StringBuilder(MaxLength + 1);
133 
134  if (NativeMethods.GetWindowText(I, stringBuilder, MaxLength) == 0)
135  {
136  logger.LogWarning("Error calling GetWindowText! Exception: {0}", new Win32Exception());
137  continue;
138  }
139 
140  var windowText = stringBuilder.ToString();
141  if (windowText == "Yes")
142  {
143  //smash_button_meme.jpg
144  logger.LogTrace("Sending \"Yes\" button clicks...");
145  for (var J = 0; J < SendMessageCount; ++J)
146  {
147  const int BM_CLICK = 0x00F5;
148  var result = NativeMethods.SendMessage(I, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
149  }
150  found = true;
151  break;
152  }
153  }
154 
155  if (!found)
156  logger.LogDebug("Unable to find \"Yes\" button for \"Network Accessibility\" window in owned process {0}!", processId);
157  }
158  }
159  catch (OperationCanceledException)
160  {
161  logger.LogTrace("Cancelled!");
162  }
163  finally
164  {
165  logger.LogDebug("Exiting network prompt reaper...");
166  }
167  }
168 
170  public Task StartAsync(CancellationToken cancellationToken)
171  {
172  runTask = Run(cancellationTokenSource.Token);
173  return Task.CompletedTask;
174  }
175 
177  public async Task StopAsync(CancellationToken cancellationToken)
178  {
179  logger.LogTrace("Stopping network prompt reaper...");
180  cancellationTokenSource.Cancel();
181  await runTask.ConfigureAwait(false);
182  registeredProcesses.Clear();
183  }
184 
186  public void RegisterProcess(IProcess process)
187  {
188  if (process == null)
189  throw new ArgumentNullException(nameof(process));
190 
191  lock (registeredProcesses)
192  {
193  if (registeredProcesses.Contains(process))
194  throw new InvalidOperationException("This process has already been registered for network prompt reaping!");
195  logger.LogTrace("Registering process {0}...", process.Id);
196  registeredProcesses.Add(process);
197  }
198 
199  process.Lifetime.ContinueWith(x =>
200  {
201  logger.LogTrace("Unregistering process {0}...", process.Id);
202  lock (registeredProcesses)
203  registeredProcesses.Remove(process);
204  }, TaskScheduler.Current);
205  }
206  }
207 }
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 ...
+ + + + + + +
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
+
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
+
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 ...
+
int Id
The IProcess&#39; ID
Definition: IProcess.cs:14
+
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
+
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..c51192af0b --- /dev/null +++ b/_windows_post_write_handler_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..5cbcd98907 --- /dev/null +++ b/_windows_post_write_handler_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +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 
3 namespace Tgstation.Server.Host.IO
4 {
9  {
11  public void HandleWrite(string filePath)
12  {
13  if (filePath == null)
14  throw new ArgumentNullException(nameof(filePath));
15  }
16  }
17 }
+ + +
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..cc69bc99bb --- /dev/null +++ b/_windows_symlink_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..20033e69d7 --- /dev/null +++ b/_windows_symlink_factory_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + +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.
2 using System;
3 using System.IO;
4 using System.Threading;
5 using System.Threading.Tasks;
6 
7 namespace Tgstation.Server.Host.IO
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  //no don't fucking use this
26  //sure it works in SOME cases
27  //i.e. win10 1803+ and IN DEVELOPER MODE
28  //other times it throws ERROR_INVALID_PARAMETER
29  //but the fucking worst is there is some configuration of windows that accept the argument and allow the function to succeed
30  //BUT IT DOESN'T CREATE THE FUCKING LINK
31  //I AM NOT DEBUGGING THAT SHIT AGAIN AHHH
32  //flags |= NativeMethods.CreateSymbolicLinkFlags.AllowUnprivilegedCreate;
33 
34  cancellationToken.ThrowIfCancellationRequested();
35  if (!NativeMethods.CreateSymbolicLink(linkPath, targetPath, flags))
36  throw new Win32Exception();
37  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
38  }
39 }
+ + +
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..ecfa55dc63 --- /dev/null +++ b/_windows_system_identity_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..3cc8a06642 --- /dev/null +++ b/_windows_system_identity_8cs_source.html @@ -0,0 +1,114 @@ + + + + + + +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 
7 namespace Tgstation.Server.Host.Security
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 
68  var newIdentity = new WindowsIdentity(identity.Token); //the handle is cloned internally
69 
70  return new WindowsSystemIdentity(newIdentity);
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
+ +
+ + + + diff --git a/_windows_system_identity_factory_8cs.html b/_windows_system_identity_factory_8cs.html new file mode 100644 index 0000000000..093d93f6aa --- /dev/null +++ b/_windows_system_identity_factory_8cs.html @@ -0,0 +1,120 @@ + + + + + + +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.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..d8e498e22f --- /dev/null +++ b/_windows_system_identity_factory_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + +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 
10 namespace Tgstation.Server.Host.Security
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  return principal != null;
81  };
82 
83  if (!TryGetPrincipalFromContextType(ContextType.Machine) && !TryGetPrincipalFromContextType(ContextType.Domain))
84  return null;
85  return (ISystemIdentity)new WindowsSystemIdentity(principal);
86  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
87 
89  public Task<ISystemIdentity> CreateSystemIdentity(string username, string password, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
90  {
91  if (username == null)
92  throw new ArgumentNullException(nameof(username));
93  if (password == null)
94  throw new ArgumentNullException(nameof(password));
95 
96  var originalUsername = username;
97  GetUserAndDomainName(originalUsername, out username, out var domainName);
98 
99  var res = NativeMethods.LogonUser(username, domainName, password, 3 /*LOGON32_LOGON_NETWORK*/, 0 /*LOGON32_PROVIDER_DEFAULT*/, out var token);
100  if (!res)
101  {
102  logger.LogTrace("Failed to log in username {0}!", originalUsername);
103  return null;
104  }
105 
106  logger.LogTrace("Successfully logged in username {0}!", originalUsername);
107 
108  using (var handle = new SafeAccessTokenHandle(token)) //checked internally, windows identity always duplicates the handle when constructed with a userToken
109  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
110  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
111  }
112 }
+ + +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + +
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 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 ...
+ +
Native methods used by the code
+ +
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" ...
+ +
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+ +
+ + + + diff --git a/annotated.html b/annotated.html new file mode 100644 index 0000000000..c6831b4a0d --- /dev/null +++ b/annotated.html @@ -0,0 +1,501 @@ + + + + + + +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]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 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
 CException
 CIApplicationLifetime
 CIDesignTimeDbContextFactory
 CIDisposable
 CIEventLog
 CIHostedService
 CJsonConverter
 CMigration
 CModelSnapshot
 CServiceBase
+
+
+ + + + diff --git a/api.html b/api.html new file mode 100644 index 0000000000..6c59983fce --- /dev/null +++ b/api.html @@ -0,0 +1,361 @@ + + + + + + +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. Should be in the form Agent/Version (i.e. SomeTgsClient/1.2.4)
  • +
  • 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

1 {
2  "bearer": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZXhwIjoiMTUzMzIzNjk0MSIsIm5iZiI6IjE1MzMyMzYwNDEiLCJpc3MiOiJUZ3N0YXRpb24uU2VydmVyLkhvc3QiLCJhdWQiOiJUZ3N0YXRpb24uU2VydmVyLkFwaSJ9.QWFSWNi9mgol582zaK4MQ5XDK2gZF-Nx3z9_ToHjKW4"
3 }

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:

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

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):

1 {
2  "updateFromOrigin": true
3 }

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

1 {
2  "checkoutSha": "<commit sha>"
3 }

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

1 {
2  "reference": "<branch or tag>"
3 }

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

1 {
2  "updateFromOrigin": true,
3  "reference": "branch"
4 }

+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.

+
1 {
2  "newTestMerges": [
3  {
4  "number": 12345,
5  "comment": "I'm merging this for x reason"
6  },
7  {
8  "number": 12346,
9  "pullRequestRevision": "abcdef1"
10  }
11  ]
12 }

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

+
1 {
2  "accessUser": "",
3  "accessToken": ""
4 }

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:

+
1 {}

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..84553477eb --- /dev/null +++ b/architecture.html @@ -0,0 +1,306 @@ + + + + + + +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/arrowdown.png b/arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/arrowright.png b/arrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 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..38523d2d11 --- /dev/null +++ b/class_auto_generated_program-members.html @@ -0,0 +1,111 @@ + + + + + + +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..180eeab0e0 --- /dev/null +++ b/class_auto_generated_program.html @@ -0,0 +1,313 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string[] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Api.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+
4 {
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string[] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+
4 {
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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().

+
4 {
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string[] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Host.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+
4 {
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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().

+
4 {
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string[] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Client.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+
4 {
+
+
+
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..7f85372588 --- /dev/null +++ b/class_controller.html @@ -0,0 +1,116 @@ + + + + + + +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_exception.html b/class_exception.html new file mode 100644 index 0000000000..c27b347cb0 --- /dev/null +++ b/class_exception.html @@ -0,0 +1,126 @@ + + + + + + +tgstation-server: Exception Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
Exception Class Reference
+
+
+
+Inheritance diagram for Exception:
+
+
+ + +Tgstation.Server.Client.ClientException +Tgstation.Server.Host.Core.JobException +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 + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_exception.png b/class_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..7abe28cc8e18e65aa9992a337dc406fe0cd37fdb GIT binary patch literal 9718 zcmeHt2~<<(+Ah{(si1OO5obBJ35rYtDrL-ZK-o-MltHG5h?Ih$K$w%%Uy&**x)B)^ zQZ+&?5L9FcQxFTtm>MKuNC?OfLm**D2qDw`g4*G%cAftJI_uuM&boW8tRy=-d+%@W z=Xu`eeZGD9i0h%18XGj!)YMi&4hP)S)IK7DSLG*5!J3S#x{2Uz-4W+w_DZD^e0)10 z!lX6a0G}3L_4W13E;Dt(*H5C|T#u@OjZ{l_>oGGmHDoe$VDGWGC6lblm`=5-ZYww1YEn(RCo|k|V!!yaRo`#a zl>S_Map~Kp2D@mJA+@R}kF{7%Uw-@k=M%(hwpjV|qd3-P&tyjp^_{nfQ#to+e;}S! zTk5zVn$9+(9v8{ZEr{Y33Q;Ki@(klMj^A}0q&pPD;&64%jp;*%Zvo9d6G$V6gM zP`2mVR=au4{i@9_*^DF;gU=c0%MPutW=0@iJ8CHPKeibuN$aZWBxIp8v=v{hz`W$p za5sgsoQERANk+5%fRhh08E-3i`b6-!6P(ZyC_oqN{~yR?tm>p#UOg#%L06C8D{+HD&^<8U>O}A9u7o*U%x8a zA|SS^`0-knOHXdN!GwM6>X?Fljl@^1i!5$=ga5z%XO3SvCMQ26$u2)6r>UUd%BAa> zbv{BLnqjmfU0@i2cL8s;KMN0V^gClFdWfAy_VHFh2#=T zDDP=AU*WEYy(=Fwg-<>Alpc-|wH)>D$8~WwnokD3We3wPh-b@)>`#Q-L*SazX)M-W z8oGq$xx<=M+)Ih#S$41nDkQ0i3M{uW%sVERZP#2?S5M)Yvpb}Zi~Y3>TwvX&sYG=F zN7h6?XnfFUcI3rJio?}XF^nrlSay)^Mp901CIz2O9ONDBKvavpG%K%)I_yeIld`^! z>czX~&D{{bl`}QSeJ?TJV?OuNZFp5(ok|po1_*JXtl2ZR$m6C;$-a8~%}PH4I$~-R z>0c|MURRdvc;QyY29yASW4w2KOF8XAFuk9x;7SDmw1&|?+J%bOhriB ze;f+iXpwMDj~gH*yFM{N)*gu4!BqywiqnNb@!n^ep1LvjV33@Hw|#?i*mLoQ4n8Ha z?^OFw9V%&+@7KW^bDyiuE7d}-ey6IZ=vr~M2wR3~35l^S8k&9^-navdH2`7zHHrb- z)ii0H&s#gK%W(xZk*6@JmU_aZ7z=3NvfNXi3D-$* zdf9%~b}!gY3$f&FkV3!dmJlm8Z<*NONDGAz!{U=aJ1>+=vrolbLx#Y&{MxYatq;(O zRYA)h;E(kP;BPI!UrYhOpT7!!xoFt6Yga}{PCg}AkGsp|Xm)VqreP*6G% z(Skk-q)j!@{mA5{DxPU&Xs`Mn4AbtI+n3*hOCeQhU!4(`E6Y3;!@?^T%Bw6kW+K=_ zv{(cB$$aC;YyAtnrUa*H|5=q#KDt2GpYo|y` zc|m25;;3BF^RuHy^HdZ>T|YiMY;NA6$n~K{GH1H|NKswE6@{qM{EQT>C;a78G^tsm znI}oTeW{=4m-zL@vn7|#*Z~Aw2XZ>^N9MEL6TMN0 z7AI95AUIkbjqo^5*u?KndqHHHSp&;Hw%y}w{e^c>U9ZletXA(OG8|RR)V+n@i3%;c#CSthu?#UP3Ja5Vl zY5YA-R%$?nzZUf-g8e<*utau%mQf7Nq&<;-7W0W0xOF%~u2!iNylF2o88wW$0h!pF zL5jUQ^kwUn*CGiBB&74(8~vw907y3j;=FX~V}PO~gA@Rl{}%TCMH%|H>?>m1dnWcR ziCa2wn6_9){?h0K4u4ob%CbUUCCTN{%X}VGY|(3xC9E-l@)r4!4e3%RE?e=oux%zn z*~R>d@~(xs#=_XJgcP7LZ$`G1lMGXAbw=-9lL73r=v9? zqeJ_P68ox!bM*gX7jvnUWc3;6Y@9$`;&a6QJv*dV+{r&38 zmb#IQ@vq+F8_n=-YZD>66EOWlTXddD;@HLtK;Xd?c;K*v#Gr>zcfT(WG)Yp6zGgYX z??BJ|IVd+%o7`GR^{;MRjchSjAzjzO>Zrii8NHd?edV`E_txtQB2$#UW1a4m4~e|> z%5E5!l$2Dn8vi-BEt1mi%5#o$!Z}%5m~k(-&t_L3U0mCE?v>4nX$p(<1{75b>36DA z*P&`k`h-c9+8KyrS2E<0t#hLOvlX6W?}3lMOK@0-za)N|VBALFBpD1D$c;xOk-^5? z`=AaOH{K_qMq2F|k{>W+iqJ1vn!{7{bd1fM^Lg<~FaXU}X#4Hl&Z}65$5)6krhK29E#_1?*V*sds+N1zt2{DwA;!&`726 zDPV)0E?vifHHlFh__iWlTSFH618`ejDp9`;EZC)oKFlD@ z%Fg0obhv(4-V!RsWOJrV8)>$mJ>C|Mg>8%!vdxf z_=VA1(%rnXn1nnYse-R-Vc`KA2c8igXR#LM)=f69mIX|g0Pl?7#`Qa2ZRNA0{TGPa zPvdSx%T0Y=G1y6p;sB~nE`t3)C5p8~bJ6L>xt4fz2D!O%RT7eGG^OjfFa=7VCfweMs!(C-#D^iTTDnBIfLzMh%$@I|?{$bKa5 zT!-JvOz1Ph7MNL5 z?BZZX$>SeDChyM*qBYmzw>H+u@7(s6hGXzXT>D8xeA8}z1v?87Ke+J$I{FcSmlo{* z8Qn6rLkWCI9rJ0&Z~2DfEr=NBLh#!zSnD}vx&fDbL@dggZo zJml)+@o}fyTvJlTy26@;35=iWh)d%>=ic95XP2YCm$U{y@N6ppe14*)xB}^?Ub#)2 zTvYndWPHJ+fl_kLnA>zfV8m?(i}kcKEprr?9pr(T(c?OHUUOdfd~bN_Gk&GVbU?$} z5aCe3o;JD1zB78s$}cv;#%3HXgx{t`LnHSfQ%*D0A;RChTFCDF!!5GDr1})k$@c=U z)C`4C)HnX}PIu94O*k^?%yTj~GC2G3X%~jw>Xnhj{)4SV)R(IhPbuIr4~lD zbF6V(hVadR1;Vc*X;Pe9X0zySTrxp%d2GZj=|TlREcu(cG`7VZy*WaM)yao1zqdEN z7@TwyFQ<7-xAd~fd6F*YlhhEBW(~5te+T1%i6mxCm_(=J5OZxMc}a%$^}wSvCpZTU z7}8;7_^fKZxo%`=-;LCVGq64f1+vsTrprN6;bOH z#R%oikLBdSMOn(Et=#*A;Z6%*2S(=jl`cbdQl8|j{FKTS+2IN~r7J<^^1n(Dxtqmg zt2(O(JX3a{uX-IU)QLNOw&c=)fO3PswLW6Oq%3J&&8=wGD0=IATDUFJBHZJ8yW{je zK#QtQrY1!Bg0;U%UQYBWMUlc@JATZsSSJI zhtlh9tS^DX8JabA^jaSI8JkV({Vp`CST(5ap^Ns%y0oYdnmLpdkp$S$b4zFnAzG~6 zpnygSBHjNRKe)ysL)$}^*b16lgk;YjHG2PCRZisOKXUHcHK|s!Bx0Ms_PpT8U&xgH z50{g+ehB17A8eX9eHY{i%Xa^j(E*$MhyKTJgGZ=WJ0-00Qm=OmXlkP;p&27pk*1n+ zhao!$7@=9$M|o6VCh!oGFZz_)#qY1%EkFWtLS#(z;g3Qya zN9JNH=ce)tFVs~B4?J69ya36cZw_`=%Iua&h3H&%-%KKM1$^wB+I<-&MnP)Vj%7Gk67=0!jYm=nMH`~^LF_xIV~iMND8nNR2& zSk){9)~hAyIVW7pmQ$;H8aMrn(ov`4MKwH-CL(pxr#pYO{CgD{FUN+AkDqzKaieie zOY+gfojSsHd5XF-tP%mx2zI`87Q zqhUDsheTBrF8C=8p^9?2U%MX(_BVPT<*X9lfH+I?PSLhmMkbEgb56U>r$|V|)ON{I zXe|zPTY9KqPpjOF8E+~^0+T1ojl|<`HCw#B{e61Z#E-xne2cm?JW@S4H3b$MrY9|BVd7eW64 z`h$-L-!{sQ%T$Cgg7Aa`@Q4yn05yuvflSJFLYF}AK$sC2EjGCNe?oV>}`+G(3Wov zSlGU2^ReN!1r0v;t8(X%vA>u0S*$tJ@U`dT#EZSGe(Q7O(wy*FaF8{sg8(0}IRH45 zMWf@JTX(&dY`c1TAkc_wMyED(`1;3q8=n!W9VSdl-^scct$G&-D_13Lb%eWMRan`{ zk%m{I*H7jAE&VQ?$?wd^XYqT75iLhm^+^}9iW>D5pmWE`-*y(0$us+aus7z`>o`gS~ z_Zh1DM%+;>`nHWFwYK0*i4dhJNk7{`d8*hMq{^*ygoH7jndYHND)qQpG)K5*V+N=x zDIl@goIZjE=$@XB2R$#0_-n%VpDpVbhy}A~xEG_8@cPFG!hGSR6eo7E7vmCVs60h> zn%{UVGotj;wL`9;-L;Daoo8<=F|A7p8eDQPJhO369qzJ=x0;W$IK2Y`}=z%~HHGPam?ILGN zqe5gh&wZAoxv~0B-yy&BGn>Na=67_G;|-YDmlJ_yFu8{lM2*1OHlE~1g-|GWOW!g& zeW)OM3%M>7fu zOZZxp0`Q+B5XqJR8B!z%uTQ9C$WiMZsRjxFp1; znFN+R5*Lmd%ooY6`giX~3pxCC<>yT@{y>f*C23UuUGy%>&H5%W;Ayw?Q}i z{89G^V{htQ@4oVcGtP5wmQd~#09@BEcCntpyduu8U91(`ocqnp$o3isnlQy}T zMMrLyQxzQbMLNk`>`g0f7yHtRzfDUws@j#_uukSovmXOnYEpFDzb_ru_K-dznGQ-_F6t)=ux-4waKtPdNbO&&SkU!x;DN$=eR$n(3~HY&5l8 zm3%YJxWnZp2p3o#ce1-ou==559}RIlD)(#M(e(C`U_X^ye2EOkdpQ;X*Ir%J?Cv8 zKm7~(_g&5K;GNZa&Jk}ZP_&b@KFw42T2Wo=PaR`17Z0V+b*_!7#T#=kXfdv!BKmF! zb>?H?0qeTR3GZ}^D2Zd$HZIPx%aMi|5#JVqr(1?|du|JZ$Y{MR_sccVA_>CBT8cry z`M?N?U13$hZ+t2Gyqr${PDY0te5U{Y&igc;2i`uOjWQIsiHbZcqQ6FRu>;$>P(E!x z4lnk$*Ms%B9Mkr3wr8%?=0{Kpcv0b1%xtHsudCJ!_mYi&6x2>{O(mVK#1&=KdQ6P6 zdXF(?Y|~1&iy7sra!{J8U|fq=4XXKUdbGcG`l)C|ST$OEmci%s+`}yZV2D|qVvinoA1S~@vbs|1s>8;gX~=o KkoKMUum263`1#QQ literal 0 HcmV?d00001 diff --git a/class_i_application_lifetime.html b/class_i_application_lifetime.html new file mode 100644 index 0000000000..0ed5b3cf6b --- /dev/null +++ b/class_i_application_lifetime.html @@ -0,0 +1,114 @@ + + + + + + +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: IEventLog Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
IEventLog Class Reference
+
+
+
+Inheritance diagram for IEventLog:
+
+
+ + +Tgstation.Server.Host.Service.ServerService + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_i_event_log.png b/class_i_event_log.png new file mode 100644 index 0000000000000000000000000000000000000000..50855341d44e53a1667e070c602d8c835ca73776 GIT binary patch literal 731 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+15=i#i(^OyFwMY4GputXH-${K>Y|gU- zrVn~Khs_w2z=W8z=F*gH+z-SHm<_fuUMSuj*`CY5qhquNsDkOuA(%3R2BKMy&2OEs ze15+8G>~wfrULfzB#}hvZHk_PN8N7ed7fQe7yGWPc4_jDi7Ku+hrczS{{GmaermZ< z&StY?|IW3k@UD3qf4ML#S?S!FA2&BN_a1%v_u0CVufJ+;M_vEEb^H7~kL`Ex-)<}M z-P?O9aMAqZFY63vmYcn~ckEY7P*$ARs`Y6O6Ti<%nVC3wUEd0`wh8)=-zfP#nad-6 zV+DWY^THn?s;ie=xm@>FD|pHy8^6cJR_{Y@FiZPRFltto?tdC&cCk3W#P{H>6`FBJ zGS#kKKeGPmT+Zs0$0f^quCAY5bobERl^eHj{9oVqxTHE)?S0OT{Hwh;+{{lWET40= z_p`N{!O;SFZLHtBkbE8WtZRN@N^Y!%HzW;xE2l*FVhpXY3Q%|F4|EJ0A&Oct0D O89ZJ6T-G@yGywn^|4&B% literal 0 HcmV?d00001 diff --git a/class_i_hosted_service.html b/class_i_hosted_service.html new file mode 100644 index 0000000000..d4f0f458f5 --- /dev/null +++ b/class_i_hosted_service.html @@ -0,0 +1,123 @@ + + + + + + +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..803bfd69b4 --- /dev/null +++ b/class_migration.html @@ -0,0 +1,121 @@ + + + + + + +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.MSInitialCreate +Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup +Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity +Tgstation.Server.Host.Models.Migrations.MYInitialCreate +Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup +Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired + +
+
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..0f7874000f2b408698d026b4d3408869cffee2d9 GIT binary patch literal 8011 zcmeHMc~n#P)4mr0k*b zPyc5kP??tEs+?n!Za>m8{nB|&$wOOoo&HJH3WJi2`|#UAv{E@UtnOf!o|xs$`pvDM z9aaD?rpS8Z>MP`=XnEk?un=sC{jhD=Vy=MfG_-pLiP?6Uy4mYIt)TPzV>b>z+X;O^ zLv85pjxRGp?*E>Y+E`GXY6wNwLTwS&wy`3DqBg1`f?WS3fgHNJWZqMix-kikW<4>mBP)mVk$0qjHTWQMJ(AATk_5M$|EB+u6Lg(-5fnN5V)mWlBZnf#_ z?=`kuA%C>#!FDSv;pX==|9+)FbIH=H!juI3nx*fp`vzL)lI0(-`PML71iDmNo&;C_Jj8N6XRCjg%Rp9Fob69hFH2;W5~ zv5Mz2q5wb;u3x2RA+XL+NJ7-XGW-#HT?#X8+$6?0F=C8qA)%+djPwJ5#m%SFgnMmS zTz2V;J97$Dt%NDG++W5~ixG-cOZ z>1iXla)tuN_r0>Z8z=%|BP`soU6m1Z&%Jg4{H=rhCi8scicBiY^`K)Co4pt~X*V?Y(>Hf=K zF{m94$57I9o=K$bRY5N#CXD%8t#uDQY)zbURuzLHbGVN5Y1OC1sri9M{OB+msN2o2 z*&iF9T-E7}e;Mrla6Lj1H$&~sRQ=P}dZsri1P}vsj}qR?&S*Wvoo(9uLX*m?u>tZ7Ov zD7t~YEo^`e>1|M?YlhIiR_s3UWxh=8eAwfCBH9a)ybR%f4NIFf>t0~iu3XRuyeyNy zL1Y`(fFk2U=uyXeAsDrj&`J9QCgMCr$bet1V7-O5(vkCs*^abI7G#T#aGKh>1!l;4 zL+3IOJlWh(lV_>wVXe<9rh}qtlO{{=Ie$ub1c_il@7&q-{{0FZGn=3Nluaf`E5E!f z__1B7aO3#&$XKL}3(jfoz5FliY^ybKwCb??plGL;sSrY7zb{fXlH?5--;&uXso%p` z*N1Q}4vLCnT_H`1uE0wzH~|0!;JgX^=C71!o_|LD9#q@DvktNt7;vh6IWR)6!U+9v z3)C$%9xX!m@BhK+Sxcm2+n$RMP{Ws|59t&h1rQ+Ed=Pyh@FNJYjt+kujAMbiUTc8o z)hN!!(O9Q308id?xp)Ovo-)K@@JamGjW3)VPM7XePTRO|(AS@ADt8B%pTp=_1>h-e zE09I@b?GUkz^xd8E1o#cKewk%e?XeSnvJeIjlMvzwwY{Ltj+`lC-47fMp$EP2teILjJNN=$Vc(X$*UG+hZwOY?;irX1h2Xr= z0o&^3BnM9E3$WJs9VYjD*0X+UWA(Ag(J@P2x`e)*yG(9hno^$8cY$pcNk@lwsv?^9 z(Lj|ij6`;UFf~5$z}S@6pl>hOUO^B4Y)-i`xQr^ivnKEj4xtOB%IMQ{0DZwE0bYG8 z*r_@5eE1-zCNFk%Owq)RYL`>_URB4Kfk&vgZG5wWsIixR@;qEpKuAWe2SUFgn!sHR z0P5ZBuQ@5uA+P~>B&zF#={Fr0?>Kb0aU37&B21=-ZNKEZjd~-n_6&B%LmPP`Ugvo& z0~C=y2Otu}7LmQZ=gyL8x1^LRBq5qPk}ou67+)A1qL3sGyteSs&nNDIr)JY$hO zwYv1i%G#)RpwIkb@qr>sZWV!MtA-P+!EOUMY?4W>z`U1g^IaqwM6-j2gUofM5V85HZ{* zNB8I|kun;@SEDK8Qk0Z-hHu`Wt*l`$2f^qp=t8DFbm2Xh2`9I{Mox!8?c8piA7VC# zfSq32R+lYXi~N7Zm7-#ZD{mRJIYV$vU#CB|OVIs(#&bR2fV7YWf9<}DYU7cX@hieE zLCJHgOOYS;YJY?n*gS=7-kQS{xi#`W9GR?b$>oZC+bvdvqy>46Fa+zB+XG%xCbk}K z7iW_V&&^C%=pSJmmG=yr~;SR;{uwSAsg6<>w zniHSB;780i8IaaR&0usRX&$mq?;7A~Yba&X!fK<_;XP0Re&^1yyLZ{j9vRX)ek?R2 zFB7Z|n((vwsVkqA8N|pH0TnTAihopf7h`m}Tc%r!4~WK2fATzejG_{M;>~8oXOs1z zgMHo`L2P`y_Y=KvGl8B@J`ifpK}|$CKdSEbR(9*p9!6|IPz3@~WB;mLuNExdg(PXa` zzpM4tTExKmDP+9r8J4Yh$raNEx}s@da!gxK+x6_KLR7zRLwI6Ss`n-bMZ2PAp-@Tl zlVdi7&jtq-uaxuF^As&jtw|df9`eWKL9CQG))(Cq;sm$EXXQ}qyOdAna%H|HpxOJ| z5@v00Sex0H!}56q@amff0N?)4*RZu@zAGT+v~&X|2>gF8;PXsN)%VqqiR9&RN1Vs^0jYqiX-^N|btt{CD~w5nTkXgfx9O>soJx@yj}fSTNd37<9hwLUu3H9p@@DWp(e z;cDcc5-2cN1p_@zoR|MP+ARp5_*wsEK2^ZhqX zbkwck4DOyd&AhXY^(>$(Lh_)oiN>?0F)(4yf$FWLkGlI@yy(c+>)LkPLC97W&pF zCz>UtpU(!Jsp+fS(L`?I`g!)p7bcI zv%CP>d6OAqxj3xp`T1QNbonoLZo3L$wdxILs~sP!x29%4gFUPkI+pbhNcufwBk<@8 zY#UH0CRF9jI@xYS4B%i<2)Q_G)F11@pS2_8{yv3da`OjX83HOKj>ozGW>flC;rk0S z{iDOu(glz0L zEGO8;y8PP4q7Ku2+#nlkzG!1D-q={8Wt&9S=$=C$Ns6(g^d7HPdEeA;ZS4L<8_R%f zY~Pe`5$Xn4CP&75r|gqA`@|CkmMJ0Wingdr?!dGqOs6U6Te8x3oa}S6^|M9IykkG5 zrOB#vh4s}gU8YrYza|hEoU>@ib41TE2H(AJPUA1WSAMgXPNE9 z?v+kP>cw5ZSb97-nusz7@Lf5F6vZ}4FnE`S3+7F`nWHETRD}UYi)p^Sn|6;TYA=tk zL<73ARcPfbbm&4l#wK5Qykr__H59?J3^+vVPbSl9@wbHmlYy|F&SZ(YjefLt#!p*l z0kLi`L9pX4ENA_JSE8rdXs^LoK?Oz3h@_6jzn0YUz!zEM6q&ri42_pn&&ZR>_Z*;p zFUe@bm-wex(@QV;junGu5>&WTb|=c!{X&+jo@Y?ntEI=f>3v+WQ#r;~A*^h9zvE{k ztG940jrhjMO2OAg_Lh;bU>yWM%s5qt0PsSabtbqNJ@^4}7a>|_g?(%tO@ukt+O-Ts zqJf1i|0UeNO1QHr$UaFn7*H}e!=(e*-KC%?M)Iir{IJ44T+l0K2U}^03Qm%uO_cHF z-E*`5#Obj>(N=i(Nu^|dk=c>smO^GkY_YIMkws>l7tBy^vZ%r=xsl^%hyh*LXT@0T zo-$Ba$;uVsIHvDV+d1Dantfh|cW#NIdSG`A~oR?UJRD4pwnY-}%;s_Wr1T)yOp7 zt<4;P18B5tdQ9EWZP-@AONPYr6P9gGB%!3WJOl`YMoQ$@Bc+KWS1KVIRkTPPaVp(| z?5u7vM7*fQ%+}seCIi0oNX;s#a-RbAK$5VC&W<(?ObyIlmgk8Pjw4`W*biHN6 z^%0*!6uGs%fj%fWeesK`hC3ORo}}(;#0k>s=sgzoe!`<}e%X)AE=hD?ii<`JuWZ3U zIyPW=L{#rc>$d6L{%I>KF!!DBNFlDE=82Or`o6{s8xTbIk&*p=0w=|q%EUKlk&>tk^)a&M*b%6 z1ka?-t8q@8xG&RLzw)m4$A1_LZgT{@s?O}uzx&D+f@$x!(@2OSgO5@&dJN?|17$a( zN8L70N0uk}HB6(_Ge49Fux!WIgQtfjWCn18qKP`>FQu=P6jT>l8j-uIzLkQ|v{yWZ zLtB8)#;A2J6O`JjXI%xIyV5{S9bebC^IkTp3gsB`aR_g*84-~ZN33m6FyCz`bF21= zUe~h3a_^j&Q0`^I?6(1Hj}a0V_s^O%Sem`?>tWOz9DjRFweYih^>3&7Ve9tR_In^C zjm9O`>}dyMA41&ZUX>+9dNNy@K!}aG%iAm~D$sNvC=|+MhYLZ_H8kxC_VFBb%bxS_ z02sp=%*6tc%bP!*7&9di&J}2;p9J9f6oONJK#6SD&)S5nA3XYIBx>_t#rr2h_h&JT z;qVt+fu_nH)m)V*a0me6xW5@sy>e13@5dxFBePbQIf5-$CIrx zTw7r*jJMW)Mfn{xiwLjLj0#F|sd=w!SI3QMzxbl55nS5XTAcgQYiZ2W zGS-^(D}r^%w>|rsV1p-XdZC|h-V&?{a;B_Q--hi)?etDNmIe7;W7|;Qi_=l&i5=V= zFby7snxgSfDhv~=QjNdrgIFVdP@b;#I<;tBx4gBkE5#_Rs`ndyZCheR{MWq;6O2HC zEWS}P9Xh@pcGKx^`S+T8%GChM8}?;u?wTju4{lv3d|?9(rTF*eZ&M=EDA_bqBjPy0 zpWfqM783>V!WNbytgWo9;#WY#mPszfOfvU-pN2-mi?}xXC9YY4Tzc=pcr?O(;s@JdU}@o3oYFDTP>Wp!6+wgqT3In*NB&lS?E6usNp@?pvX`V zYEF-Y-w{U*v&B(qTc96!^fn;e9ie&gMbdVm`s1fgLr`wH0%6??uAN6}{y) literal 0 HcmV?d00001 diff --git a/class_model_snapshot.html b/class_model_snapshot.html new file mode 100644 index 0000000000..79ca3ba92d --- /dev/null +++ b/class_model_snapshot.html @@ -0,0 +1,115 @@ + + + + + + +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_service_base.html b/class_service_base.html new file mode 100644 index 0000000000..86446e36f7 --- /dev/null +++ b/class_service_base.html @@ -0,0 +1,114 @@ + + + + + + +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..7c54f4144b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_api_headers-members.html @@ -0,0 +1,131 @@ + + + + + + +tgstation-server: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.ApiHeaders Member List
+
+ + + + + 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..fce92f6e7f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_api_headers.html @@ -0,0 +1,875 @@ + + + + + + +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...
 
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...
 
ProductHeaderValue UserAgent [get]
 The client's 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 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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 105 of file ApiHeaders.cs.

+
105  : this(userAgent, token, null, null)
106  {
107  if (userAgent == null)
108  throw new ArgumentNullException(nameof(userAgent));
109  if (token == null)
110  throw new ArgumentNullException(nameof(token));
111  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 119 of file ApiHeaders.cs.

+
119  : this(userAgent, null, username, password)
120  {
121  if (userAgent == null)
122  throw new ArgumentNullException(nameof(userAgent));
123  if (username == null)
124  throw new ArgumentNullException(nameof(username));
125  if (password == null)
126  throw new ArgumentNullException(nameof(password));
127  }
+
+
+ +
+
+ + + + + + + + +
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 133 of file ApiHeaders.cs.

+
134  {
135  var jsonAccept = new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(ApplicationJson);
136  if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType))
137  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Client does not accept {0}!", ApplicationJson));
138 
139  if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || !ProductInfoHeaderValue.TryParse(userAgentValues.FirstOrDefault(), out var clientUserAgent))
140  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} headers!", HeaderNames.UserAgent));
141 
142  //assure the client user agent has a name and version
143  if (String.IsNullOrWhiteSpace(clientUserAgent.Product.Name) || !Version.TryParse(clientUserAgent.Product.Version, out var clientVersion))
144  throw new InvalidOperationException("Malformed client user agent!");
145 
146  //make sure the api header matches ours
147  if (!requestHeaders.Headers.TryGetValue(ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name != assemblyName.Name)
148  throw new InvalidOperationException("Missing API version!");
149 
150  if (!Version.TryParse(apiUserAgent.Product.Version, out var apiVersion))
151  throw new InvalidOperationException("Malformed API version!");
152 
153  ApiVersion = apiVersion;
154  UserAgent = clientUserAgent.Product;
155 
156  if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization))
157  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} header!", HeaderNames.Authorization));
158  var auth = authorization.First();
159  var splits = new List<string>(auth.Split(' '));
160  var scheme = splits.First();
161  if (String.IsNullOrWhiteSpace(scheme))
162  throw new InvalidOperationException("Missing authentication scheme!");
163 
164  splits.RemoveAt(0);
165  var parameter = String.Concat(splits);
166  if (String.IsNullOrEmpty(parameter))
167  throw new InvalidOperationException("Missing authentication parameter!");
168 
169  if (requestHeaders.Headers.TryGetValue(instanceIdHeader, out var instanceIdValues))
170  {
171  var instanceIdString = instanceIdValues.FirstOrDefault();
172  if (instanceIdString != default && Int64.TryParse(instanceIdString, out var instanceId))
173  InstanceId = instanceId;
174  }
175 
176  switch (scheme)
177  {
179  Token = parameter;
180  break;
182  Password = parameter;
183  var fail = !requestHeaders.Headers.TryGetValue(usernameHeader, out var values);
184  if (!fail)
185  {
186  Username = values.FirstOrDefault();
187  fail = String.IsNullOrWhiteSpace(Username);
188  }
189  if (fail)
190  throw new InvalidOperationException("Missing Username header!");
191  break;
192  default:
193  throw new InvalidOperationException("Invalid authentication scheme!");
194  }
195  }
const string jwtAuthenticationScheme
The JWT authentication header scheme
Definition: ApiHeaders.cs:41
+
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&#39;s API version
Definition: ApiHeaders.cs:71
+
string Username
The client&#39;s username
Definition: ApiHeaders.cs:81
+
ProductHeaderValue UserAgent
The client&#39;s user agent
Definition: ApiHeaders.cs:66
+
const string instanceIdHeader
The InstanceId header key
Definition: ApiHeaders.cs:36
+
string Password
The client&#39;s password
Definition: ApiHeaders.cs:86
+
const string passwordAuthenticationScheme
The password authentication header scheme
Definition: ApiHeaders.cs:46
+
const string usernameHeader
The Username header key
Definition: ApiHeaders.cs:31
+
const string ApiVersionHeader
The ApiVersion header key
Definition: ApiHeaders.cs:26
+
string Token
The client&#39;s JWT
Definition: ApiHeaders.cs:76
+
long InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+
static readonly AssemblyName assemblyName
The current AssemblyName
Definition: ApiHeaders.cs:51
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 204 of file ApiHeaders.cs.

+
205  {
206  UserAgent = userAgent;
207  Token = token;
208  Username = username;
209  Password = password;
211  }
Version ApiVersion
The client&#39;s API version
Definition: ApiHeaders.cs:71
+
string Username
The client&#39;s username
Definition: ApiHeaders.cs:81
+
ProductHeaderValue UserAgent
The client&#39;s user agent
Definition: ApiHeaders.cs:66
+
string Password
The client&#39;s password
Definition: ApiHeaders.cs:86
+
string Token
The client&#39;s JWT
Definition: ApiHeaders.cs:76
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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
if the given version is compatible with the API. otherwise
+ +
+
+ +
+
+ + + + + + + +
bool Tgstation.Server.Api.ApiHeaders.Compatible ()
+
+ +

Checks if the ApiVersion is compatible with Version

+
Returns
if the API is compatible, otherwise
+ +

Referenced by Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 224 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Client.ApiClient.RunRequest< TResult >().

+
225  {
226  if (headers == null)
227  throw new ArgumentNullException(nameof(headers));
228  if (instanceId.HasValue && InstanceId.HasValue && instanceId != InstanceId)
229  throw new InvalidOperationException("Specified instance ID in constructor and SetRequestHeaders!");
230 
231  headers.Clear();
232  headers.Accept.Add(new MediaTypeWithQualityHeaderValue(ApplicationJson));
234  headers.Authorization = new AuthenticationHeaderValue(jwtAuthenticationScheme, Token);
235  else
236  {
237  headers.Authorization = new AuthenticationHeaderValue(passwordAuthenticationScheme, Password);
238  headers.Add(usernameHeader, Username);
239  }
240  headers.UserAgent.Add(new ProductInfoHeaderValue(UserAgent));
241  headers.Add(ApiVersionHeader, new ProductHeaderValue(assemblyName.Name, ApiVersion.ToString()).ToString());
242  instanceId = instanceId ?? InstanceId;
243  if (instanceId.HasValue)
244  headers.Add(instanceIdHeader, instanceId.ToString());
245  }
const string jwtAuthenticationScheme
The JWT authentication header scheme
Definition: ApiHeaders.cs:41
+
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&#39;s API version
Definition: ApiHeaders.cs:71
+
string Username
The client&#39;s username
Definition: ApiHeaders.cs:81
+
ProductHeaderValue UserAgent
The client&#39;s user agent
Definition: ApiHeaders.cs:66
+
const string instanceIdHeader
The InstanceId header key
Definition: ApiHeaders.cs:36
+
string Password
The client&#39;s password
Definition: ApiHeaders.cs:86
+
const string passwordAuthenticationScheme
The password authentication header scheme
Definition: ApiHeaders.cs:46
+
bool IsTokenAuthentication
If the header uses password or JWT authentication
Definition: ApiHeaders.cs:91
+
const string usernameHeader
The Username header key
Definition: ApiHeaders.cs:31
+
const string ApiVersionHeader
The ApiVersion header key
Definition: ApiHeaders.cs:26
+
string Token
The client&#39;s JWT
Definition: ApiHeaders.cs:76
+
long InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
static readonly AssemblyName assemblyName
The current AssemblyName
Definition: ApiHeaders.cs:51
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.ApiVersionHeader = "Api"
+
+private
+
+ +

The ApiVersion header key

+ +

Definition at line 26 of file ApiHeaders.cs.

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.ApplicationJson = "application/json"
+
+ +

TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk

+ +

Definition at line 21 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Client.ApiClient.RunRequest< TResult >().

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly AssemblyName Tgstation.Server.Api.ApiHeaders.assemblyName = Assembly.GetExecutingAssembly().GetName()
+
+staticprivate
+
+ +

The current AssemblyName

+ +

Definition at line 51 of file ApiHeaders.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.instanceIdHeader = "Instance"
+
+private
+
+ +

The InstanceId header key

+ +

Definition at line 36 of file ApiHeaders.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Api.ApiHeaders.IsTokenAuthentication => Token != null
+
+ +

If the header uses password or JWT authentication

+ +

Definition at line 91 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.jwtAuthenticationScheme = "Bearer"
+
+private
+
+ +

The JWT authentication header scheme

+ +

Definition at line 41 of file ApiHeaders.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.passwordAuthenticationScheme = "Password"
+
+private
+
+ +

The password authentication header scheme

+ +

Definition at line 46 of file ApiHeaders.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.usernameHeader = "Username"
+
+private
+
+ +

The Username header key

+ +

Definition at line 31 of file ApiHeaders.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.Tests.IntegrationTest.TestStandardOperation().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.ApiHeaders.ApiVersion
+
+get
+
+ +

The client's API version

+ +

Definition at line 71 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync().

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.ApiHeaders.InstanceId
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.ApiHeaders.Password
+
+get
+
+ +

The client's password

+ +

Definition at line 86 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.ApiHeaders.Token
+
+get
+
+ +

The client's JWT

+ +

Definition at line 76 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+ +
+
+ + + + + +
+ + + + +
ProductHeaderValue Tgstation.Server.Api.ApiHeaders.UserAgent
+
+get
+
+ +

The client's user agent

+ +

Definition at line 66 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.ApiHeaders.Username
+
+get
+
+ +

The client's username

+ +

Definition at line 81 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+
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..12c00bd82b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration-members.html @@ -0,0 +1,113 @@ + + + + + + +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..5b116e921e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html @@ -0,0 +1,235 @@ + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Administration Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Administration Class Reference
+
+
+ +

+ 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

+
+

Definition at line 6 of file Administration.cs.

+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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 21 of file Administration.cs.

+ +

Referenced by Tgstation.Server.Tests.AdministrationTest.TestRead().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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 26 of file Administration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Api.Models.Administration.TrackedRepositoryUrl
+
+getset
+
+ +

The GitHub repository the server is built to recieve updates from

+ +

Definition at line 16 of file Administration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.Administration.WindowsHost
+
+getset
+
+ +

If the server is running on a windows operating system

+ +

Definition at line 11 of file Administration.cs.

+ +

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..ab0b467399 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond-members.html @@ -0,0 +1,111 @@ + + + + + + +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..c5cca05f78 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html @@ -0,0 +1,178 @@ + + + + + + +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 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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.Byond.Version
+
+getset
+
+ +

The System.Version of the Byond installation used for new compiles. Will be 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.

+ +
+
+
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..dc09db9f99 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot-members.html @@ -0,0 +1,117 @@ + + + + + + +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..b967043b66 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html @@ -0,0 +1,209 @@ + + + + + + +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...
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+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...
 
ChatProvider Provider [get, set]
 The ChatProvider used for the connection More...
 
string ConnectionString [get, set]
 The information used to connect to the Provider More...
 
ChatConnectionStringBuilder ConnectionStringBuilder [get, set]
 The ChatConnectionStringBuilder which maps to the ConnectionString More...
 
+

Detailed Description

+
+

Definition at line 8 of file ChatBot.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
bool Tgstation.Server.Api.Models.ChatBot.ValidateProviderChannelTypes ()
+
+ +

Validates Channels are correct for the Internal.ChatBot.Provider

+
Returns
if the Channels are valid for the Internal.ChatBot.Provider, 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 Provider
The ChatProvider used for the connection
Definition: ChatBot.cs:31
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..605fe272c6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel-members.html @@ -0,0 +1,115 @@ + + + + + + +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..f68be92b14 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html @@ -0,0 +1,301 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Api.Models.ChatChannel.DiscordChannelId
+
+getset
+
+ +

The Discord channel ID

+ +

Definition at line 18 of file ChatChannel.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.ChatChannel.IrcChannel
+
+getset
+
+ +

The IRC channel name

+ +

Definition at line 13 of file ChatChannel.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.ChatChannel.IsAdminChannel
+
+getset
+
+ +

If the ChatChannel is an admin channel

+ +

Definition at line 24 of file ChatChannel.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.ChatChannel.IsUpdatesChannel
+
+getset
+
+ +

If the ChatChannel is an updates channel

+ +

Definition at line 36 of file ChatChannel.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.ChatChannel.IsWatchdogChannel
+
+getset
+
+ +

If the ChatChannel is a watchdog channel

+ +

Definition at line 30 of file ChatChannel.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

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..2fbbb24bf2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job-members.html @@ -0,0 +1,117 @@ + + + + + + +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..a0338366e9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html @@ -0,0 +1,233 @@ + + + + + + +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...
 
DreamDaemonSecurity MinimumSecurityLevel [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

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.CompileJob.ByondVersion
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Api.Models.CompileJob.Job
+
+getset
+
+ +

The Job relating to this job

+ +

Definition at line 11 of file CompileJob.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Api.Models.CompileJob.RevisionInformation
+
+getset
+
+ +

Git revision the compiler ran on. Not modifiable

+ +

Definition at line 16 of file CompileJob.cs.

+ +

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..87e1fb057f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html @@ -0,0 +1,265 @@ + + + + + + +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 if AccessDenied is 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

+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Read(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Write().

+ +
+
+ +
+
+ + + + + +
+ + + + +
byte [] Tgstation.Server.Api.Models.ConfigurationFile.Content
+
+getset
+
+ +

The content of the ConfigurationFile. Will be if AccessDenied is or during listing and write operations

+ +

Definition at line 31 of file ConfigurationFile.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.ConfigurationFile.IsDirectory
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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..a65c7affbe --- /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,114 @@ + + + + + + +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..5da6aba9f9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html @@ -0,0 +1,276 @@ + + + + + + +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

+ +
+
+ + + + + + + +
Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.DiscordConnectionStringBuilder ()
+
+ +

Construct a DiscordConnectionStringBuilder

+ +

Definition at line 23 of file DiscordConnectionStringBuilder.cs.

+
23 { }
+
+
+ +
+
+ + + + + + + + +
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  }
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
override string Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.ToString ()
+
+virtual
+
+
+

Member Data Documentation

+ +
+
+ + + + +
override bool Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.Valid => !String.IsNullOrEmpty(BotToken)
+
+ +

+ +

Definition at line 12 of file DiscordConnectionStringBuilder.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.BotToken
+
+getset
+
+ +

The Discord bot token

+

See https://discordapp.com/developers/docs/topics/oauth2#bots

+ +

Definition at line 18 of file DiscordConnectionStringBuilder.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_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..1f356304be --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html @@ -0,0 +1,329 @@ + + + + + + +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...
 
DreamDaemonSecurity CurrentSecurity [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...
 
DreamDaemonSecurity SecurityLevel [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

+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Api.Models.DreamDaemon.ActiveCompileJob
+
+getset
+
+ +

The live revision

+ +

Definition at line 13 of file DreamDaemon.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.DreamDaemon.Running
+
+getset
+
+ +

The current status of DreamDaemon

+ +

Definition at line 23 of file DreamDaemon.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Api.Models.DreamDaemon.StagedCompileJob
+
+getset
+
+ +

The next revision to go live

+ +

Definition at line 18 of file DreamDaemon.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_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..fe6a1858fc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html @@ -0,0 +1,214 @@ + + + + + + +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...
 
DreamDaemonSecurity ApiValidationSecurityLevel [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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity Tgstation.Server.Api.Models.DreamMaker.ApiValidationSecurityLevel
+
+getset
+
+ +

The DreamDaemonSecurity level used to validate the DMAPI

+ +

Definition at line 25 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..983fadf8ff --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message-members.html @@ -0,0 +1,111 @@ + + + + + + +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..28c920ce28 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html @@ -0,0 +1,182 @@ + + + + + + +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 [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

+ + + +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.ErrorMessage.SeverApiVersion
+
+getset
+
+ +

The version of the API the server is using

+ +

Definition at line 18 of file ErrorMessage.cs.

+ +

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..94e488e338 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance-members.html @@ -0,0 +1,117 @@ + + + + + + +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..554ccf2cb0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html @@ -0,0 +1,351 @@ + + + + + + +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 ()
 
+ + + + + + + + + + + + + + + + + + + + + + +

+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...
 
ConfigurationType ConfigurationType [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

+ +
+
+ + + + + + + +
Instance Tgstation.Server.Api.Models.Instance.CloneMetadata ()
+
+ +

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ConfigurationType Tgstation.Server.Api.Models.Instance.ConfigurationType
+
+getset
+
+ +

If ConfigurationFile can be used on the Instance

+ +

Definition at line 38 of file Instance.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts().

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.Models.Instance.Id
+
+getset
+
+ +

The id of the Instance. Not modifiable

+ +

Definition at line 14 of file Instance.cs.

+ +

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.Client.InstanceManagerClient.InstanceManagerClient(), 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.Host.Controllers.RepositoryController.Read(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Core.JobManager.RunJob(), Tgstation.Server.Host.Components.Instance.TimerLoop(), 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().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Instance.Name
+
+getset
+
+ +

The name of the Instance

+ +

Definition at line 20 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.Instance.Online
+
+getset
+
+ +

If the Instance is online

+ +

Definition at line 32 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..6051296567 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user-members.html @@ -0,0 +1,117 @@ + + + + + + +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..a48c90988c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html @@ -0,0 +1,353 @@ + + + + + + +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...
 
InstanceUserRights InstanceUserRights [get, set]
 The Rights.InstanceUserRights of the InstanceUser More...
 
ByondRights ByondRights [get, set]
 The Rights.ByondRights of the InstanceUser More...
 
DreamDaemonRights DreamDaemonRights [get, set]
 The Rights.DreamDaemonRights of the InstanceUser More...
 
DreamMakerRights DreamMakerRights [get, set]
 The Rights.DreamMakerRights of the InstanceUser More...
 
RepositoryRights RepositoryRights [get, set]
 The Rights.RepositoryRights of the InstanceUser More...
 
ChatBotRights ChatBotRights [get, set]
 The Rights.ChatBotRights of the InstanceUser More...
 
ConfigurationRights ConfigurationRights [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 Tgstation.Server.Api.Models.InstanceUser.ByondRights
+
+getset
+
+ +

The Rights.ByondRights of the InstanceUser

+ +

Definition at line 27 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ChatBotRights Tgstation.Server.Api.Models.InstanceUser.ChatBotRights
+
+getset
+
+ +

The Rights.ChatBotRights of the InstanceUser

+ +

Definition at line 51 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ConfigurationRights Tgstation.Server.Api.Models.InstanceUser.ConfigurationRights
+
+getset
+
+ +

The Rights.ConfigurationRights of the InstanceUser

+ +

Definition at line 57 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonRights Tgstation.Server.Api.Models.InstanceUser.DreamDaemonRights
+
+getset
+
+ +

The Rights.DreamDaemonRights of the InstanceUser

+ +

Definition at line 33 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamMakerRights Tgstation.Server.Api.Models.InstanceUser.DreamMakerRights
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
InstanceUserRights Tgstation.Server.Api.Models.InstanceUser.InstanceUserRights
+
+getset
+
+ +

The Rights.InstanceUserRights of the InstanceUser

+ +

Definition at line 21 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
RepositoryRights Tgstation.Server.Api.Models.InstanceUser.RepositoryRights
+
+getset
+
+ +

The Rights.RepositoryRights of the InstanceUser

+ +

Definition at line 45 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

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_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..fe3fda1f4b --- /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,115 @@ + + + + + + +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..beb804972b --- /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,300 @@ + + + + + + +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 + +
+ + + + + + + + + + + + + + + + + + + + +

+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...
 
ChatProvider Provider [get, set]
 The ChatProvider used for the connection More...
 
string ConnectionString [get, set]
 The information used to connect to the Provider More...
 
ChatConnectionStringBuilder ConnectionStringBuilder [get, set]
 The ChatConnectionStringBuilder which maps to the ConnectionString More...
 
+

Detailed Description

+

Manage the server chat bots

+ +

Definition at line 10 of file ChatBot.cs.

+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionString
+
+getset
+
+ +

The information used to connect to the Provider

+ +

Definition at line 37 of file ChatBot.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ChatConnectionStringBuilder Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionStringBuilder
+
+getset
+
+ +

The ChatConnectionStringBuilder which maps to the ConnectionString

+ +

Definition at line 44 of file ChatBot.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.Internal.ChatBot.Enabled
+
+getset
+
+ +

If the connection is enabled

+ +

Definition at line 26 of file ChatBot.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings().

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.Models.Internal.ChatBot.Id
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.ChatBot.Name
+
+getset
+
+ +

The name of the connection

+ +

Definition at line 21 of file ChatBot.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ChatProvider Tgstation.Server.Api.Models.Internal.ChatBot.Provider
+
+getset
+
+ +

The ChatProvider used for the connection

+ +

Definition at line 31 of file ChatBot.cs.

+ +
+
+
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..1ac01442d4 --- /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,197 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + +
abstract override string Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.ToString ()
+
+pure virtual
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..c3a20756ce --- /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,275 @@ + + + + + + +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...
 
DreamDaemonSecurity MinimumSecurityLevel [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

+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanJob(), and Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanUnusedCompileJobs().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.CompileJob.DmeName
+
+getset
+
+ +

The .dme file used for compilation

+ +

Definition at line 20 of file CompileJob.cs.

+ +
+
+ + + +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.CompileJob.Output
+
+getset
+
+ +

Textual output of DM

+ +

Definition at line 26 of file CompileJob.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_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..51628310c5 --- /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,315 @@ + + + + + + +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...
 
DreamDaemonSecurity SecurityLevel [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

+ +
+
+ + + + + + + + +
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
if they match, otherwise
+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.ChangeSettings().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl().

+ +
+
+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.PrimaryPort
+
+getset
+
+ +

The first port DreamDaemon uses. This should be the publically advertised port

+ +

Definition at line 27 of file DreamDaemonLaunchParameters.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl().

+ +
+
+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecondaryPort
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecurityLevel
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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..2ada27ca7d --- /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,241 @@ + + + + + + +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...
 
DreamDaemonSecurity SecurityLevel [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

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.AutoStart
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..8e4c3cbf9c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html @@ -0,0 +1,362 @@ + + + + + + +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...
 
RightsType CancelRightsType [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

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.Internal.Job.Cancelled
+
+getset
+
+ +

If the Job was cancelled

+ +

Definition at line 43 of file Job.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob(), and Tgstation.Server.Host.Core.JobManager.StartAsync().

+ +
+
+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Api.Models.Internal.Job.CancelRight
+
+getset
+
+ +

The Rights required to cancel the Job

+ +

Definition at line 53 of file Job.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.Job.Description
+
+getset
+
+ +

English description of the Job

+ +

Definition at line 21 of file Job.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+ + + +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Api.Models.Internal.Job.StartedAt
+
+getset
+
+ +

When the Job was started

+ +

Definition at line 32 of file Job.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Api.Models.Internal.Job.StoppedAt
+
+getset
+
+ +

When the Job stopped

+ +

Definition at line 37 of file Job.cs.

+ +

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..5817ec3206 --- /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,352 @@ + + + + + + +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...
 
+

Detailed Description

+

Represents configurable settings for a Repository

+ +

Definition at line 8 of file RepositorySettings.cs.

+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.Internal.RepositorySettings.AutoUpdatesSynchronize
+
+getset
+
+ +

If synchronization should occur when auto updating

+ +

Definition at line 54 of file RepositorySettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RepositorySettings.CommitterEmail
+
+getset
+
+ +

The e-mail of the committer

+ +

Definition at line 20 of file RepositorySettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RepositorySettings.CommitterName
+
+getset
+
+ +

The name of the committer

+ +

Definition at line 14 of file RepositorySettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..8ceb5bdec6 --- /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,111 @@ + + + + + + +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..95f9519829 --- /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,192 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RevisionInformation.CommitSha
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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..7bf7b324e0 --- /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,120 @@ + + + + + + +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..46208e99b3 --- /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,223 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.Models.Internal.TestMerge.Id
+
+getset
+
+ +

The ID of the TestMerge

+ +

Definition at line 14 of file TestMerge.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Api.Models.Internal.TestMerge.MergedAt
+
+getset
+
+ +

When the TestMerge was created

+ +

Definition at line 20 of file TestMerge.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_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..d0417eeaf1 --- /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,344 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase ()
+
+protected
+
+ +

Construct a TestMergeBase

+ +

Definition at line 40 of file TestMergeBase.cs.

+
40 { }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase (TestMergeBase copy)
+
+protected
+
+ +

Construct a TestMergeBase from a copy

+
Parameters
+ + +
copy
+
+
+ +

Definition at line 46 of file TestMergeBase.cs.

+ +

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.

+
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
+
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.Author
+
+getset
+
+ +

The author of the pull request

+ +

Definition at line 35 of file TestMergeBase.cs.

+ +

Referenced by Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.BodyAtMerge
+
+getset
+
+ +

The body of the pull request

+ +

Definition at line 21 of file TestMergeBase.cs.

+ +

Referenced by Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.TitleAtMerge
+
+getset
+
+ +

The title of the pull request

+ +

Definition at line 15 of file TestMergeBase.cs.

+ +

Referenced by Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.Url
+
+getset
+
+ +

The URL of the pull request

+ +

Definition at line 28 of file TestMergeBase.cs.

+ +

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..ad4e094cf8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html @@ -0,0 +1,336 @@ + + + + + + +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...
 
AdministrationRights AdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRights InstanceManagerRights [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 Tgstation.Server.Api.Models.Internal.User.AdministrationRights
+
+getset
+
+ +

The Rights.AdministrationRights for the User

+ +

Definition at line 44 of file User.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.UserController.Update().

+ +
+
+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Api.Models.Internal.User.CreatedAt
+
+getset
+
+ +

When the User was created

+ +

Definition at line 27 of file User.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Controllers.UserController.Create().

+ +
+
+ + + +
+
+ + + + + +
+ + + + +
InstanceManagerRights Tgstation.Server.Api.Models.Internal.User.InstanceManagerRights
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.User.Name
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.User.SystemIdentifier
+
+getset
+
+
+
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..e68eeed032 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html @@ -0,0 +1,424 @@ + + + + + + +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...
 
IrcPasswordType PasswordType [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

+ +
+
+ + + + + + + +
Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder ()
+
+ +

Construct an IrcConnectionStringBuilder

+ +

Definition at line 49 of file IrcConnectionStringBuilder.cs.

+
49 { }
+
+
+ +
+
+ + + + + + + + +
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  }
91 
92  if (splits.Length < 6)
93  return;
94 
95  var rest = new List<string>(splits);
96  rest.RemoveRange(0, 5);
97  Password = String.Join(";", rest);
98  }
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
+ +
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
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 101 of file IrcConnectionStringBuilder.cs.

+
102  {
103  var sb = new StringBuilder();
104  sb.Append(Address);
105  sb.Append(';');
106  sb.Append(Port);
107  sb.Append(';');
108  sb.Append(Nickname);
109  sb.Append(';');
110  if(UseSsl.HasValue)
111  sb.Append(Convert.ToInt32(UseSsl.Value));
112  if (PasswordType.HasValue)
113  {
114  sb.Append(';');
115  sb.Append((int)PasswordType);
116  sb.Append(';');
117  sb.Append(Password);
118  }
119  return sb.ToString();
120  }
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
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + +
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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Nickname
+
+getset
+
+ +

The nickname for the bot to use

+ +

Definition at line 29 of file IrcConnectionStringBuilder.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Password
+
+getset
+
+ +

The optional password to use

+ +

Definition at line 44 of file IrcConnectionStringBuilder.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IrcPasswordType Tgstation.Server.Api.Models.IrcConnectionStringBuilder.PasswordType
+
+getset
+
+ +

The optional IrcPasswordType to use

+ +

Definition at line 39 of file IrcConnectionStringBuilder.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Port
+
+getset
+
+ +

The port the server runs on

+ +

Definition at line 24 of file IrcConnectionStringBuilder.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.IrcConnectionStringBuilder.UseSsl
+
+getset
+
+ +

If the connection should be made using SSL

+ +

Definition at line 34 of file IrcConnectionStringBuilder.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_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..4636f89837 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html @@ -0,0 +1,239 @@ + + + + + + +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...
 
RightsType CancelRightsType [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

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.Job.CancelledBy
+
+getset
+
+ +

The User that cancelled the job

+ +

Definition at line 16 of file Job.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Api.Models.Job.Progress
+
+getset
+
+ +

Optional progress between 0 and 100 inclusive

+ +

Definition at line 21 of file Job.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.Job.StartedBy
+
+getset
+
+ +

The User that started the job

+ +

Definition at line 11 of file Job.cs.

+ +
+
+
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..b3d083fde9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository-members.html @@ -0,0 +1,126 @@ + + + + + + +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..e7340ba7a5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html @@ -0,0 +1,411 @@ + + + + + + +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 , 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...
 
+

Detailed Description

+

Represents a git repository

+ +

Definition at line 8 of file Repository.cs.

+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Api.Models.Repository.ActiveJob
+
+getset
+
+ +

The Job started by the Repository if any

+ +

Definition at line 38 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Repository.Origin
+
+getset
+
+ +

The origin URL. If , the Repository does not exist

+ +

Definition at line 13 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Repository.Reference
+
+getset
+
+ +

The branch or tag HEAD points to

+ +

Definition at line 48 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Api.Models.Repository.RevisionInformation
+
+getset
+
+ +

The current Models.RevisionInformation for the Repository

+ +

Definition at line 23 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..a30611aba9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information-members.html @@ -0,0 +1,114 @@ + + + + + + +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..b3b89d1e60 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html @@ -0,0 +1,222 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
List<TestMerge> Tgstation.Server.Api.Models.RevisionInformation.ActiveTestMerges
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
List<CompileJob> Tgstation.Server.Api.Models.RevisionInformation.CompileJobs
+
+getset
+
+ +

The CompileJobs made from the RevisionInformation

+ +

Definition at line 21 of file RevisionInformation.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TestMerge Tgstation.Server.Api.Models.RevisionInformation.PrimaryTestMerge
+
+getset
+
+ +

The TestMerge that was created with this RevisionInformation

+ +

Definition at line 11 of file RevisionInformation.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_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..d0bcf426d4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information-members.html @@ -0,0 +1,111 @@ + + + + + + +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..913f832f62 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html @@ -0,0 +1,178 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.ServerInformation.ApiVersion
+
+getset
+
+ +

The Api version of the host

+ +

Definition at line 18 of file ServerInformation.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.ServerInformation.Version
+
+getset
+
+ +

The version of the host

+ +

Definition at line 13 of file ServerInformation.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_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..e518a5a847 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge-members.html @@ -0,0 +1,121 @@ + + + + + + +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..de5222076c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html @@ -0,0 +1,201 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.TestMerge.MergedBy
+
+getset
+
+ +

The User who created the TestMerge

+ +

Definition at line 9 of file TestMerge.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_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..866a17f3f1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters-members.html @@ -0,0 +1,112 @@ + + + + + + +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..7becd54391 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html @@ -0,0 +1,224 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.TestMergeParameters.Comment
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Api.Models.TestMergeParameters.Number
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

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..091ec43b9b --- /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,110 @@ + + + + + + +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..e9002cfce4 --- /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,140 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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..f882f13b83 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token-members.html @@ -0,0 +1,111 @@ + + + + + + +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..a91d270c67 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html @@ -0,0 +1,182 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Token.Bearer
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Api.Models.Token.ExpiresAt
+
+getset
+
+ +

When the Token expires

+ +

Definition at line 18 of file Token.cs.

+ +

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..ec73a53032 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user-members.html @@ -0,0 +1,119 @@ + + + + + + +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..efd9097cc1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html @@ -0,0 +1,229 @@ + + + + + + +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...
 
AdministrationRights AdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRights InstanceManagerRights [get, set]
 The Rights.InstanceManagerRights for the User More...
 
+

Detailed Description

+
+

Definition at line 4 of file User.cs.

+

Member Data Documentation

+ +
+
+ + + + +
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().

+ +
+
+ +
+
+ + + + +
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

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.User.CreatedBy
+
+getset
+
+ +

The User who created this User

+ +

Definition at line 19 of file User.cs.

+ +
+
+
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..dc7f4913b0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html @@ -0,0 +1,197 @@ + + + + + + +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...
 
AdministrationRights AdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRights InstanceManagerRights [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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.UserUpdate.Password
+
+getset
+
+ +

Cleartext password of the User

+ +

Definition at line 11 of file UserUpdate.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_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..21d7687c5e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper-members.html @@ -0,0 +1,114 @@ + + + + + + +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..312f383ed8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html @@ -0,0 +1,336 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + + +
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
if rightsType is an instance right, otherwise
+ +

Referenced by Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), and Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext().

+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 42 of file RightsHelper.cs.

+
42  : Enum
43  {
44  var flags = new List<string>();
45  IEnumerable<string> GetRoleNames()
46  {
47  foreach (Enum J in Enum.GetValues(right.GetType()))
48  if (Convert.ToInt32(J, CultureInfo.InvariantCulture) != 0 && right.HasFlag(J))
49  yield return String.Concat(typeof(TRight).Name, '.', J.ToString());
50  };
51  var names = GetRoleNames();
52  return String.Join(",", names);
53  }
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..383038de24 --- /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,110 @@ + + + + + + +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..51f0522003 --- /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,146 @@ + + + + + + +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

+ +
+
+ + + + + + + +
void Tgstation.Server.Api.Rights.Tests.TestRights.TestAllPowerOfTwo ()
+
+ +

Definition at line 14 of file TestRights.cs.

+ +

References Tgstation.Server.Api.Rights.RightsHelper.RightToType().

+
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
+
+
+
+
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..c7ab354246 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_routes-members.html @@ -0,0 +1,125 @@ + + + + + + +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..867a5d3ac7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_routes.html @@ -0,0 +1,510 @@ + + + + + + +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

+ + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string Tgstation.Server.Api.Routes.SetID (string route,
long id 
)
+
+static
+
+
+

Member Data Documentation

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Administration = Root + nameof(Models.Administration)
+
+ +

The Models.Administration controller

+ +

Definition at line 19 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.AdministrationClient.AdministrationClient().

+ +
+
+ + + +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Chat = Root + "Chat"
+
+ +

The Models.ChatBot controller

+ +

Definition at line 69 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.Components.ChatBotsClient.ChatBotsClient().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Configuration = Root + "Config"
+
+
+ +
+
+ + + + +
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().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.DreamDaemon = Root + nameof(Models.DreamDaemon)
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.DreamMaker = Root + nameof(Models.DreamMaker)
+
+ +

The Models.DreamMaker controller

+ +

Definition at line 74 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.Components.DreamMakerClient.DreamMakerClient().

+ +
+
+ +
+
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Controllers.ConfigurationController.Update().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.InstanceManager = Root + nameof(Models.Instance)
+
+ +

The Models.Instance controller

+ +

Definition at line 29 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.InstanceManagerClient.InstanceManagerClient().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.InstanceUser = Root + nameof(Models.InstanceUser)
+
+ +

The Models.InstanceUser controller

+ +

Definition at line 64 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.Components.InstanceUserClient.InstanceUserClient().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Jobs = Root + nameof(Models.Job)
+
+ +

The Models.Job controller

+ +

Definition at line 79 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.Components.JobsClient.JobsClient().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Repository = Root + nameof(Models.Repository)
+
+ +

The Models.Repository controller

+ +

Definition at line 39 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.Components.RepositoryClient.RepositoryClient().

+ +
+
+ +
+
+ + + + +
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(), and Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.User = Root + nameof(Models.User)
+
+ +

The Models.User controller

+ +

Definition at line 24 of file Routes.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_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..3ed72a4af1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers-members.html @@ -0,0 +1,111 @@ + + + + + + +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..f8e7142175 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html @@ -0,0 +1,173 @@ + + + + + + +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 ()
 
+ + + +

+Private Attributes

readonly ProductHeaderValue productHeaderValue = new ProductHeaderValue("Tgstation.Server.Api.Tests", "1.0.0")
 
+

Detailed Description

+

Tests for ApiHeaders

+ +

Definition at line 11 of file TestApiHeaders.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Api.Tests.TestApiHeaders.TestConstruction ()
+
+ +

Definition at line 16 of file TestApiHeaders.cs.

+
17  {
18  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(null, null));
19  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(productHeaderValue, null));
20  var headers = new ApiHeaders(productHeaderValue, String.Empty);
21  }
readonly ProductHeaderValue productHeaderValue
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly ProductHeaderValue Tgstation.Server.Api.Tests.TestApiHeaders.productHeaderValue = new ProductHeaderValue("Tgstation.Server.Api.Tests", "1.0.0")
+
+private
+
+ +

Definition at line 13 of file TestApiHeaders.cs.

+ +
+
+
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..5dc05e7c30 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_administration_client-members.html @@ -0,0 +1,114 @@ + + + + + + +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..f4aed0a362 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_administration_client.html @@ -0,0 +1,276 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.AdministrationClient.AdministrationClient (IApiClient apiClient)
+
+ +

Construct an AdministrationClient

+
Parameters
+ + +
apiClientThe value of apiClient
+
+
+ +

Definition at line 21 of file AdministrationClient.cs.

+ +

References Tgstation.Server.Api.Routes.Administration.

+
22  {
23  this.apiClient = apiClient;
24  }
readonly IApiClient apiClient
The apiClient for the AdministrationClient
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
Task<Administration> Tgstation.Server.Client.AdministrationClient.Read (CancellationToken cancellationToken)
+
+ +

Get the Administration represented by the IAdministrationClient

+ +

Implements Tgstation.Server.Client.IAdministrationClient.

+ +
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Client.AdministrationClient.Restart (CancellationToken cancellationToken)
+
+ +

Restarts the TGS server

+ +

Implements Tgstation.Server.Client.IAdministrationClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.AdministrationClient.Update (Administration administration,
CancellationToken cancellationToken 
)
+
+ +

Updates the Administration setttings

+ +

Implements Tgstation.Server.Client.IAdministrationClient.

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.AdministrationClient.apiClient
+
+private
+
+ +

The apiClient for the AdministrationClient

+ +

Definition at line 15 of file AdministrationClient.cs.

+ +
+
+
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..a847803f9f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_client-members.html @@ -0,0 +1,134 @@ + + + + + + +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
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..b9038997dd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_client.html @@ -0,0 +1,1052 @@ + + + + + + +tgstation-server: Tgstation.Server.Client.ApiClient Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ApiClient Class Reference
+
+
+ +

+ 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)
 
Task< TResult > Read< TResult > (string route, CancellationToken cancellationToken)
 
Task< TResult > Update< TResult > (string route, CancellationToken cancellationToken)
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, CancellationToken cancellationToken)
 
Task Update< TBody > (string route, TBody body, CancellationToken cancellationToken)
 
Task< TResult > Create< TBody, TResult > (string route, TBody body, CancellationToken cancellationToken)
 
Task Delete (string route, CancellationToken cancellationToken)
 
Task< TResult > Create< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Read< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 
Task Delete (string route, long instanceId, CancellationToken cancellationToken)
 
Task Delete< TBody > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Delete< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Create< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Patch< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
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]
 
Uri Url [get]
 
TimeSpan Timeout [get, set]
 
+ + + + +

+Private Member Functions

async Task< TResult > RunRequest< TResult > (string route, object body, HttpMethod method, long?instanceId, CancellationToken cancellationToken)
 Main request method More...
 
+ + + + + + + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 58 of file ApiClient.cs.

+
59  {
60  this.httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
61  Url = url ?? throw new ArgumentNullException(nameof(url));
62  headers = apiHeaders ?? throw new ArgumentNullException(nameof(apiHeaders));
63 
64  requestLoggers = new List<IRequestLogger>();
65  }
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
void Tgstation.Server.Client.ApiClient.AddRequestLogger (IRequestLogger requestLogger)
+
+ +

Adds a requestLogger to the request pipeline

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Delete (string route,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Delete (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Delete< TBody > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Delete< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Client.ApiClient.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Patch< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Read< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Read< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<TResult> Tgstation.Server.Client.ApiClient.RunRequest< TResult > (string route,
object body,
HttpMethod method,
long? instanceId,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Main request method

+
Parameters
+ + + + + + +
routeThe route to run
bodyThe body of the request
methodThe method of the request
instanceIdThe optional Api.Models.Instance.Id for the request
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response on success
+ +

Definition at line 79 of file ApiClient.cs.

+ +

References Tgstation.Server.Api.ApiHeaders.ApplicationJson, and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+
80  {
81  if (route == null)
82  throw new ArgumentNullException(nameof(route));
83  if (method == null)
84  throw new ArgumentNullException(nameof(method));
85  if (body == null && (method == HttpMethod.Post || method == HttpMethod.Put))
86  throw new InvalidOperationException("Body cannot be null for POST or PUT!");
87 
88  var fullUri = new Uri(Url, route);
89 
90  var message = new HttpRequestMessage(method, fullUri);
91 
92  var serializerSettings = new JsonSerializerSettings
93  {
94  ContractResolver = new CamelCasePropertyNamesContractResolver(),
95  Converters = new[] { new VersionConverter() }
96  };
97 
98  if (body != null)
99  message.Content = new StringContent(JsonConvert.SerializeObject(body, serializerSettings), Encoding.UTF8, ApiHeaders.ApplicationJson);
100 
101  headers.SetRequestHeaders(message.Headers, instanceId);
102 
103  await Task.WhenAll(requestLoggers.Select(x => x.LogRequest(message, cancellationToken))).ConfigureAwait(false);
104 
105  var response = await httpClient.SendAsync(message, cancellationToken).ConfigureAwait(false);
106 
107  await Task.WhenAll(requestLoggers.Select(x => x.LogResponse(response, cancellationToken))).ConfigureAwait(false);
108 
109  var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
110 
111  if (!response.IsSuccessStatusCode)
112  {
113  ErrorMessage errorMessage = null;
114  try
115  {
116  //check if json serializes to an error message
117  errorMessage = JsonConvert.DeserializeObject<ErrorMessage>(json, serializerSettings);
118  }
119  catch (JsonException) { }
120 
121  const string BadSpecExtension = " This is not part of TGS4 communication specification and should be reported if it was returned from a TGS4 server!";
122 
123  switch (response.StatusCode)
124  {
125  case HttpStatusCode.UpgradeRequired:
126  throw new ApiMismatchException(errorMessage ?? new ErrorMessage
127  {
128  Message = "API Mismatch but no current API version provided!" + BadSpecExtension,
129  SeverApiVersion = null
130  });
131  case HttpStatusCode.Unauthorized:
132  throw new UnauthorizedException();
133  case HttpStatusCode.RequestTimeout:
134  throw new RequestTimeoutException();
135  case HttpStatusCode.Forbidden:
136  throw new InsufficientPermissionsException();
137  case HttpStatusCode.ServiceUnavailable:
138  throw new ServiceUnavailableException();
139  case HttpStatusCode.Gone:
140  errorMessage = errorMessage ?? new ErrorMessage
141  {
142  Message = "The requested resource could not be found!",
143  SeverApiVersion = null
144  };
145  goto case HttpStatusCode.Conflict;
146  case HttpStatusCode.NotFound: //our fault somehow
147  errorMessage = errorMessage ?? new ErrorMessage
148  {
149  Message = "This is not a valid route!" + BadSpecExtension,
150  SeverApiVersion = null
151  };
152  goto case HttpStatusCode.Conflict;
153  case HttpStatusCode.Conflict:
154  throw new ConflictException(errorMessage ?? new ErrorMessage
155  {
156  Message = "An undescribed conflict occurred!" + BadSpecExtension,
157  SeverApiVersion = null
158  }, response.StatusCode);
159  case HttpStatusCode.NotImplemented:
160  case (HttpStatusCode)422: //unprocessable entity
161  throw new MethodNotSupportedException();
162  case HttpStatusCode.InternalServerError:
163  //response
164  throw new ServerErrorException(json); //json is html
165  case (HttpStatusCode)429: //rate limited
166  response.Headers.TryGetValues("Retry-After", out var values);
167  throw new RateLimitException(values?.FirstOrDefault());
168  default:
169  throw new ApiConflictException(errorMessage, response.StatusCode);
170  }
171  }
172 
173  if (String.IsNullOrWhiteSpace(json))
174  json = JsonConvert.SerializeObject(new object());
175 
176  try
177  {
178  return JsonConvert.DeserializeObject<TResult>(json, serializerSettings);
179  }
180  catch (JsonException)
181  {
182  throw new UnrecognizedResponseException(json, response.StatusCode);
183  }
184  }
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk ...
Definition: ApiHeaders.cs:21
+
void SetRequestHeaders(HttpRequestHeaders headers, long?instanceId=null)
Set HttpRequestHeaders using the ApiHeaders. This initially clears headers
Definition: ApiHeaders.cs:224
+
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
+ +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Update< TBody > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Update< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Update< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Update< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
ApiHeaders Tgstation.Server.Client.ApiClient.headers
+
+private
+
+ +

Backing field for Headers

+ +

Definition at line 50 of file ApiClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IHttpClient Tgstation.Server.Client.ApiClient.httpClient
+
+private
+
+ +

The HttpClient for the ApiClient

+ +

Definition at line 40 of file ApiClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly List<IRequestLogger> Tgstation.Server.Client.ApiClient.requestLoggers
+
+private
+
+ +

The IRequestLoggers used by the ApiClient

+ +

Definition at line 45 of file ApiClient.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ApiHeaders Tgstation.Server.Client.ApiClient.Headers
+
+getset
+
+ +

+ +

Definition at line 25 of file ApiClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.ApiClient.Timeout
+
+getset
+
+ +

+ +

Definition at line 32 of file ApiClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Client.ApiClient.Url
+
+get
+
+ +

+ +

Definition at line 21 of file ApiClient.cs.

+ +
+
+
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..eda5d549d7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html @@ -0,0 +1,165 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
IApiClient Tgstation.Server.Client.ApiClientFactory.CreateApiClient (Uri url,
ApiHeaders apiHeaders 
)
+
+ +

Create an IApiClient

+ +

Implements Tgstation.Server.Client.IApiClientFactory.

+ +
+
+
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..f3a4980659 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html @@ -0,0 +1,289 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + +
Tgstation.Server.Client.ApiConflictException.ApiConflictException ()
+
+ +

Construct an ApiConflictException

+ +

Definition at line 27 of file ApiConflictException.cs.

+
27 { }
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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) { }
+
+
+
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..d3098730703de5a9f407e1fcacbf7ceaf42309dc GIT binary patch literal 1182 zcmeAS@N?(olHy`uVBq!ia0y~yU}OWbJ2;quq>%b9uRUsQi!9f59u-*7B@P!fWkf-$HSo>~5Qj(*FW^UNZRPbzQgLtNG89M`h>o z`MV`OixwP9;JM${sG=X5Y`~VRuri59(z(a*UL50ttXhVKs}f>d{KW=sP6uUr4(bXu zbbuVo5Mam#RLr0S)Ow7;;iyENb= z!Gx6Mr+;|z-7HI)cbqTB&&6uy8NoL7H>s9F)jy}ZT@K3CUbK3~z3{_TE6lE*KN%kP zNO|_x-)z~v1{+=(sje()Nc`x+Cdeix*zBWw{_YD;$)k&OH-0O<91~T8<4BNUA>NT#Ey$_JNc_q;Q zOWXaV3$vY~@-Nqa{gAPJT~!xfsUtv6zizhz$?|r|!Q6(P~QO6vDj!GD{NhI&t%XHxCF9wFyhB_j0&k}fA zn=B=oqg5CLu>^k?p*WkGe?Y*ABaDS%$8ITTB(5-c(#E;Kqq6p&)Z^O>+5NDUw*2R{ADk!lRV`yoOVFy83Mj+Y*ao5+``tAHT5H=i?7=p3BaG zoAbhhZ#7S|zrp+V-D;)(a?aulo>p-kF3gumUcvFL-6{7wpXaw8uLNS>`vE}yb`r^2(%}M9Iih+d*gQu&X J%Q~loCIAZx4LAS* 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..75ab5f42aa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception-members.html @@ -0,0 +1,119 @@ + + + + + + +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..6c2d8302d5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html @@ -0,0 +1,277 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + + + + +

+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

+ +
+
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
Tgstation.Server.Client.ApiMismatchException.ApiMismatchException ()
+
+ +

Construct an ApiMismatchException

+ +

Definition at line 25 of file ApiMismatchException.cs.

+
25 { }
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..6fd4f3583909a4a56741eee20aff979373a49921 GIT binary patch literal 1324 zcmeAS@N?(olHy`uVBq!ia0y~yU=#qdJ2;quq{K9ry&x*UC&cyt|NlVdi#K0O`wvY3 zvcUMjfdj0acjSRwj*=k1Utw&%-2do30@2-v6`jDJ=+FZpTWv?Vvbv2>_}H+U4WLa4nGC%#muyu9!( z{=BTp%ja*dI;gz7bIT2S-xE1oW$&qbTb!pAZ}h4BKT~D; zR?kb_Z(>bTV*k$#YF(bJ>Z!k}{OSa*6HG6|nKd`d$TZ`fjgyK41D~!1LwEzjItIoVMy4H1ECs9_54Z#lh$=K_JCGr9{W!zS=aqd^ z+ao6>-4+Hq3E`Mhwv;G2&t;#g{;&U;_E+U)*V=uHBdQPYJg?#Dx$dx!>dKAk)=T<> z87D3|C-+ud_(qNUyXf1(^SPB{mlcYhsAZJ%-m<3sZ)DW;r?#Du} z#%-zf&olsry#h-rMrCVv$_-`nudY0h9j4e+vdCrR@=jqy|iJ*JV%GoG;F) zXRtez$FPxsQR3!XF(rq<28LzU{Q{f<4bI$rWXB?w1o73-VOi#^q^F5Y9dCatJ1_*p z(~OxybSG=qsn>t^8}8UAeBegd{lGO@OIB4@+n-6eQf(r6pj701naBUX3TLl9R+@OW z{7IhYmhMfu5(gT;Ixw7jTj9n#;j7X=uLq2k|2J>Z^WL*O+)Cd!KJT^Ohh=H!V%Kb% zv--Q$k;j+$QchJjcYV_%+N4u&tfd+xVO}2A$!pAq61>j z72P+yGHf*4UARMU;lnRp^BE@yZS+YMxjE6tA^Bew(~{L9zCC;%qKO|i<#m?6oc*_G z%aM1cEJ>GR%$^udnB>^GvDAin6Z^V`h~-t2uecvOcUQn;dz9)ob5OJ&)Lfg~A(G`H9J^n5kBv(F~o^oc~reWS3x z*|XlbpVqDjt=^OQ`6J7!%@^M`p1NAS)qUBn6|ba8hbCXp zov-u(Mt4J_IiJYD@< J);T3K0RVboNL&B_ 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..9ec3908726 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_client_exception-members.html @@ -0,0 +1,115 @@ + + + + + + +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(ErrorMessage errorMessage, HttpStatusCode statusCode)Tgstation.Server.Client.ClientExceptionprotected
ClientException()Tgstation.Server.Client.ClientExceptionprotected
ClientException(string message)Tgstation.Server.Client.ClientExceptionprotected
ClientException(string message, Exception innerException)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..d7fed1a25d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_client_exception.html @@ -0,0 +1,372 @@ + + + + + + +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:
+
+
+ + +Exception +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

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.ErrorMessage.SeverApiVersion.

+
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&#39;s API
+
Version SeverApiVersion
The version of the API the server is using
Definition: ErrorMessage.cs:18
+
+
+
+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Client.ClientException.ClientException ()
+
+protected
+
+ +

Construct a ClientException

+ +

Definition at line 36 of file ClientException.cs.

+
36 { }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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) { }
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Client.ClientException.ServerApiVersion
+
+get
+
+ +

The Version of the server's API

+ +

Definition at line 20 of file ClientException.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
HttpStatusCode Tgstation.Server.Client.ClientException.StatusCode
+
+get
+
+ +

The HttpStatusCode of the ClientException

+ +

Definition at line 15 of file ClientException.cs.

+ +
+
+
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..06d42632bf8b301388688700bfe6d9152e044166 GIT binary patch literal 9461 zcmd^F2~<96-jjS5XcqSU`{=L`6Ylk|~TKMJv=|K@Wy` zs2V^;5(XiJFgYMaNK%6k5W);GggJ~!fVWT7j<@%At+!U+TKAr{ScC(dea_zB|NYwJNBq+oKQ`?-nx@gU zgwAS}eE9YHwvTq*)oZUUqTCj4Og5dxH|;-uJ~cSKo$YE$sLPtC!9HI_x& zS+~Y~fL@Ty?M|tC5GFe)lNd!VNe*nbfOU{d?X=^%T467S%pXLFU3C*thfY9eRz|~9 zqA^iJ5fyW*azYP^{vO=K^;1w1ysb8$G9JH|!0ghvM_#|EzT(!DsIOpD9CI$x)_U$J z7}M1g3rXh1`@?R{i26`t9uMIsq|BSB<8b(Olq>A@CAhkV2V4Fq2DLEctADrmM_b*di|LIM0#pOo^`tBzFJ?e}5loO|IBlR6EZr3E+ zT7R}@&&lPVFZDC8tP}^@- z#K0_zcP&-EHt!dlJ#LIFwyIHUyM+q;WDUO0iX9rqSH#9Is106Aak*dz)_u+uB5im; zvnD)rDkjyvbWLH}7Kbi3S~OXXiAlUIZmM$@OwKWro91I*Zlr%146b<_T(iQAn-W$RxpYCqnQ;zC*N#95(G$xco(@kO z0O{S)P`~~n4@GPpO*-k-9HR|W?H+xJ=8>gz9r{RQ-uHIapC+rAmETM6x)Inj>&?un z>-3zhj&)#{8xT(exP1y^$x{I|+Q?$7KbBbbXq+6Gn;B`aFDXzbFfOHGA17#(SAA`M zXt*wW%Tc!gl9qqzVp`JQs*vIcsl7tvutFCeXoC67GHJ!;8IRNNQO1>J6IYB&PK0P{ zs8=i}7L0F_>^`$na=Pchl*5y?Q;(l`zA65C>zm)KXZNLpTVC{BI#{9b*|_%P2g?<& zn*q?>ot*d*An|(yb{f@N^0QBzKBl3*{?lX)#pTi2@ZY1(Ab356oJs^B{!31U8bY}q zsW0{)Z&Lb7uX_PhC5$2+`vsAFjy?|a5C-^Njpm|_w=BVpaUu@B%TD0NL)Y(1KTG%5 za&uhcYc=8Nb@Pq5?zt8!MKySAClra0)0`!`l3!^!)N$$-s#>sxxgm0+)LOfKx;3-+ zoHTe^T6mkhex^qXZ_|7wsB=G`x?mW$ZJ_K`UY>K^ZB9Wkw)i$VMvp;VKE9rqde%Xc zr_%UIhW$a(MoTdb(_Rsen%@d2vAZ3P969Hoyj8znj$4jW`~0ivz8z1@x#y{jsbZr5 z$XB~nLNI)MB~9WYrUAyo-kd7$vac+iAyS3g>%X1ntb{S50q?lY5Kpz(G;)EJ^eCvU zQfdarAl#H?ZeZiv;xOhl+7|B_C%zhwszkY%88F{S;m!&@-t{Gzq6&_&XYptR$w3!! zt2i*VzvCW7^rA9(UI2FdMMl+v3*ofIQx3xB-ixE3?*H=5b2$C z?Am(SJ<6UHU5QfxdI+QwvB5I#6MIRaPtwDEy@)O@V` zha*fY001SxDSy1~=BX$eQp?Ah_LDtQb5s<3YuX{j<%?VYQsDl%Qu#l?+a2{s@Lruo z>cTy4X?D^}I2UR3A_*0Yv`s5JZo4t_F595Do@G+!a~1!5t*B`iZ<|K2rUz^^xJ%x4 zeIZFhG|hk3qp7#cZ|any_6z3$gSEuyj0Xb|7Y2HcQ$5=ZO|x?541#V>RZv}j)bU}k z+k#?wy^rAL>uJHaQ0tJPx^7NUYGprc=ea5ud={vpBS>;CDJKV}cw!cIa{!l421Y<7 zE__0H+H&vC&L&nhSgi;ft_Xvle*JockrRW`9K@=c8DweepL?80iCw)JYnd&!-C-Xz z-RVg$yNhBRMXEK5vTr($HT5zvGrw%`Ab!q_Yteg^QXHFD8`w5V!zPskkbTsJVb7Ny zy#u_JoVuGmaI3Uyebog=(3OQ3O~j>?`ZJ+M=E32kElYORb5d|8rUSBQic+<2`-0Jo z3$yxSSzN>R_B!7toJ)$hZhML<5E2I9Ap_RYyr%)~XXk%|dra*eTGy)=rf*~qf|%G^ zDwoI#B96Fu8s&DD-$jKY{1sx&CFetvyjH(eq{MP$0*-P8p62lI5%g7TcQp>O%GZGw zcYu+;T8faPo{kjvdvO1uz)H^X&;XK5TcPtSdct}|nc-h3BL1vwnIyoLKNqJIN=2ce z#pGY=t3P~9?2V~QGK;;2R4j?;l#zx@LUAsA%YPBHv6VgR>E+ifi2rU{4N$sD28v@1 zxk* zSe0g9(>G?*?SEmT0hZVpM7>r_KT9M;Hizm5h^-RxG40NQu+eb@fys&vu;iG zfg>X%in6YKp(rpvbuXX`#vMrp(r-{AI z!}10O@(+@>!1F-X?pget%UM%ZDs^>Qywxp-aG2yhb^A0L@fZ+o(z`6orPbaYOC3r+ z?bn7La(f9)0wx`<;h=DBsVLtUn!bqEmPJvpS_h%MtI6wE2&^=O_kGps+ra`{S}fr2 zg6>laRDbILen;SYjyKunc%-^0RD9sOOMU$uV6DGeZTw5p9vDGo{9ItO3Hu>)Sf=yO zjLuJw$%ePZk)XFyIWM4C1ov-5w6f*0S!<%pY;0{9kSesVR(dkR-63jS%OSJ9*in;f z=8DWcc@#QlF>1YdVwaXNAZ~2p6omkH^rg=V_0%Arklvw{+mWt$glqHIpoKdB7R4nD zueSRNfVs)3YqSmta^o570g>pHu*f2{Zy0~3xWVTWXB6(?Kt!AV!0w4&H_THpPZ%*o zxRbUEKtr_!-X^`cma$DPQZV0z*oiP2`ORfF15-qs0^DbsdHH`6n-hr~OJDwWhOw@I ziR-;`RcjNXqFQfEl{@VVDos!E2s0}>yC{yLi06G)l%gwF8J(BOEc{Ou?Y(4Iq&LXy zKh@kEP80P)2(uZ&nAG0Be8xxp9TS2>n_-uaeaq>WNKV|K%btGt9}Ju%cWAyFWTH(1 z*yq?(Cmb0O5mE8U>{~VN*1QX-aYVzcQ|vD_6V;S_tM`e?XLt4VirYr%iWfE2WvXpA z0>9L+-Yz`Ll=J$10*P9t2X{gRa6lek6`n5)y`o2ZJ>PeuG2UEpNu>pj9IY*pZeU*4BloiS-Jj}Sr_90*E}~Pm^0KO{ z^4Tn^1?+yX)@Q(AO?n+^-^BS#AI(lVCVr7suRCg7FDsKOfJuE`4*R^gG~3}NgDg0O zPCf3B)u{1y;l;s#j(wgCz&hK+X*U3;7HA1+e5_qI?ZbW2;0Gu1Q7W;R@ZblBv(DsR z)K_(kW?QKSWQba2uDTQIFX#J`&*-p1qmu4~ISfdKY$|bRrz%siCRM2;LIIcnR~xR) z%~Vx+btpUHuBYJrH@?0BisRz||I<1XEb~E_jaBy4$Cs8#T#E9^#vz;Zn(1JHI})Ze zSSM-uBWa%Riz7CgsU^(+uKo<6Q8~hJ>G?(7!$yfb(X`Xe*=?VruV#dxgkH>e{=~~| z8T9%0%^+#btk;`q*)pNe$1=6Z`va_63y8OUX%&PuF)``976Y4j%{KTK`=4w1R>j}P zmK!wSVkWsBsJCI(1ERZCgGQEF?TeMbM% zCWd9;wY2;JTi9xVP+24P#vO{!UyvlSsRwi0!od6y&T9!@w4g%W6LE%6QbUiTo}``iWiNyT5<)CQ_v??3qhCM{p)B zN=gm%m>4LtXFZcF+F#)K^z7n5jXtZTD4{W)>1hS$%9S{cLN^TE3BkMPHj%8O0*3A8 zoS)=7j8$y6VlBkTC4ZK=ByTs7%ycEo{j5b#HUamygXCgPflW#Jx_7Okc6^7>e~9r6 zFJ#+i2H^2uHKpfuq=8Wc$SBxbQ=aw-Plx4-{}Ms6qor*mcYEq;} z=_#%^cctEB!XO@zWf)=5m|$Ae67`eXFTXV|9&>5Eh|cYcsDIGiNqnpfuD=VpK9DlU zDqWk1k6yalQ}x*@Ch!y-auVV!NYuQXxM{%y2GiBMgmvIBoOp};)RLic70CWA@~fIg z>7J5GLiNcLPS6=6F!nEn5uNXAE;)?GRc#T(AKHrr5zn)A=!K3pPbPMzox`vGWlFPO z)T458kU=%USw*tK)-v~xAM!UgIaI}V#uv0*j9XR8%S2fL%&x4`mgC#kg#f$)p*sd% zyvIe=e+43-lq@^0&C_FWFh~!7kbMEDAE+e!d-(noF#c8mpZ*1*T3UZLK6c_S4ha8* zwr^;M41U&dW4k=yTc~;0KjqbpZvA6fzp3@qA-Kc8Z1)_!C#z|}WQ@Q080>_!(lHI; zh?*A2gEm(^&+6bK$adhmHxXSs1yj;Ec~GMdS=9=Q$0JT=H2_UixZdRj_q?wad1&9T zt(M?W!;kYqS86~8vn;rZpxK39ytv@-%;JZE)CR6#qTybQUNUMk(z9|=3$F|M_Za&B zFrBn?`O_iCE3NmVUIWQP%B4av~xbT`}xJpMJn@ znPDF=MmZpvBiHoM;>jNdg_bA1clxUf7t-CEIHB%J<$^`l8nyaVME7rn+=sSG7w#Gx zd0t}qRgK@IBt6SBH((Ofh2LGE!=3%kcHC@=sC$X>&eGE5`e)!m^9gqst#=uYWv~q- zST$2Q zGIsF0c)d;nTsGk1^1~L76%3rk*sD58r?t{e ziTw79$p2sMg35~yKr2p<)yj605U*>_?NYgkn#Tg=lPf!_DZH9jf80{;G7Eb&cet3A5JYn~>2qOiTOIp%=r}41~Q)ifX<$I>gOotLU;4VznoGlh+CQP|y)&>HrtJszJ9^Cm) zO82-I^RX$T>QK_hr!SgFbZLiO2Hc@Y;ijZylwGU#Z3ZFZ6D5X z*^!56++dgnfA7SIzaF+UC)K?yX#p6)X(CXjNk?Iq*)f1^6LzJ+J1WoCUf0C(%CabT zdBZA7${pkq7g>S|hlMLrDy3jobwc3FjU>8*V4>=LFqusWZo(ZXcVRqi6=X)NO{Gh- zgNs+ks<@^sRI9zyE>4hYsq{SGA&8xFQb}J=Ls;&=1PbEK5w7RUO7&`|TECJa)-c%5 zoCTiXml_5b8%w%h{qsA63AA$Q^Nuv%Ckrtrpq`~?I0zdocs&}QKM}A}TPq^F>wbME zyD{H!HOq1Q;YyB|NNzH@FAEk1m{lvl7}VI#xO5E`uGhnvGpgfs*|)Wpd}%{E8!xyW?au?y3OpoDX* zfScGokKiXJASA{Q2=Y3%=Di$#8_*vZDteh)G`*4VAW?k#{2SSn4v+B$XKaEC$5i5X z;_Kb}1a0gMk_aC)A-ZR8*HbW*6dB6bOi~gKY+e5ik&eNV#v4Ds*sR=Vew^jX2wq;{YseXI%*c?GeBQu5Bu~>Ip&fHa9GMd=f;dgI;0I+ zHllI$j4vS`Ib2IEGw~y&ru_xgh5=>@ezxFMet4l$Wgim zH-q%1yM(XWJ}JQ99p}ow*&1UhmoS($p*hctc-cxcw}WiMB`k9$Y{H`?*MaStt7M6# zSxCw=+A=yTEFpi80vV2{Q#73t`m5_z`FJGojiy-H19;m2=6@axJgN?0ezLjZ-3gYQ z`E?Pu@}C}b#{G)<1)u1tpzC$t13y>n{V+hM)bA)XX;_+h7@qeV^F!chfvzMDD*>jD z9y=8jS9$l9s#z+^ll@8Mk$IH3&joBxZ#@M`@}eVvQANKusy{jtM7H53Pc57MO&+bz z$TAr;u&3tL6?<|*?Np1)Y?>>KnU3`l6Aexdaauh8&7@iRSlJZ3(~X~7fXW8859e@& zyakkh)aO#(7S>|lm07tJ=j^}aqSrG2KZ{{V+7H6d!jV|MqfoEur~Llx!$*#}OvnTq zY&h*6R9Sxs`?$BLK@{ZM$*MzM9MMH*+z%d}okdqp^t_KXmn^xS-8<{p#-YWDGz!yZ zG-+Qx3g;f_`!2ijmUn?Dhms#+DVj(ZaLed;Kv}2p+M3%=2@q{_X1F|SF;GeAaZ|5vjB7w)xEMj`;aC?6L+R8b~@Tc$=`Ho&B_K6Xpe}5CyoZ>VYDLh zIeu>f-7vzlZ@AaprR8s`c#qRG%2Rt}g?2L?g-P!2HW}@+Mw~nRthzXm-LNseoOOdU z$o$2`Qp7pQsJr6g^NVe)g~1^tT)P$c^818y$0Dm5%@xO*U;Dckgx<@dZqoSaec$eo@;ksgN(zvvZ>S4 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client-members.html new file mode 100644 index 0000000000..616c433597 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client-members.html @@ -0,0 +1,116 @@ + + + + + + +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..18e5ff1990 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html @@ -0,0 +1,366 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 27 of file ByondClient.cs.

+ +

References Tgstation.Server.Api.Routes.Byond, and Tgstation.Server.Api.Routes.List().

+
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
readonly IApiClient apiClient
The IApiClient for the ByondClient
Definition: ByondClient.cs:16
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
Task<Byond> Tgstation.Server.Client.Components.ByondClient.ActiveVersion (CancellationToken cancellationToken)
+
+ +

Get the Byond active System.Version information

+ +

Implements Tgstation.Server.Client.Components.IByondClient.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<Byond> Tgstation.Server.Client.Components.ByondClient.Byond (Routes. Byond,
byond??throw new  ArgumentNullExceptionnameof(byond),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Byond> > Tgstation.Server.Client.Components.ByondClient.InstalledVersions (CancellationToken cancellationToken)
+
+ +

Get all installed Byond System.Versions

+ +

Implements Tgstation.Server.Client.Components.IByondClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.ByondClient.apiClient
+
+private
+
+ +

The IApiClient for the ByondClient

+ +

Definition at line 16 of file ByondClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.ByondClient.instance
+
+private
+
+ +

The Instance for the ByondClient

+ +

Definition at line 20 of file ByondClient.cs.

+ +
+
+
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..0ff406fdc2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client-members.html @@ -0,0 +1,119 @@ + + + + + + +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..db54fcccf2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html @@ -0,0 +1,490 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 27 of file ChatBotsClient.cs.

+ +

References Tgstation.Server.Api.Routes.Chat, Tgstation.Server.Api.Models.Internal.ChatBot.Id, Tgstation.Server.Api.Routes.List(), and Tgstation.Server.Api.Routes.SetID().

+
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
readonly IApiClient apiClient
The IApiClient for the ChatBotsClient
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.ChatBot (Routes. Chat,
settings??throw new  ArgumentNullExceptionnameof(settings),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.ChatBot (Routes. Chat,
settings??throw new  ArgumentNullExceptionnameof(settings),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.Create (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Create a ChatBot

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.ChatBotsClient.Delete (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Delete a ChatBot

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.GetId (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Get a ChatBot's setttings

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +
+
+ + + + + + + + +
Task<IReadOnlyList<ChatBot> > Tgstation.Server.Client.Components.ChatBotsClient.List (CancellationToken cancellationToken)
+
+ +

List the ChatBots

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.ChatBotsClient.apiClient
+
+private
+
+ +

The IApiClient for the ChatBotsClient

+ +

Definition at line 16 of file ChatBotsClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.ChatBotsClient.instance
+
+private
+
+ +

The Instance for the ChatBotsClient

+ +

Definition at line 20 of file ChatBotsClient.cs.

+ +
+
+
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..fad1a33a67 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html @@ -0,0 +1,554 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 41 of file ConfigurationClient.cs.

+ +

References Tgstation.Server.Api.Routes.Configuration, and Tgstation.Server.Api.Routes.List().

+
42  {
43  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
44  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
45  }
readonly IApiClient apiClient
The IApiClient for the ConfigurationClient
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile (Routes. Configuration,
directory ,
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile (Routes. Configuration,
file??throw new  ArgumentNullExceptionnameof(file),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.CreateDirectory (ConfigurationFile directory,
CancellationToken cancellationToken 
)
+
+ +

Creates an empty directory

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.ConfigurationClient.DeleteEmptyDirectory (ConfigurationFile directory,
CancellationToken cancellationToken 
)
+
+ +

Delete an empty directory

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<ConfigurationFile> > Tgstation.Server.Client.Components.ConfigurationClient.List (string directory,
CancellationToken cancellationToken 
)
+
+ +

List configuration files

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 57 of file ConfigurationClient.cs.

+ +

References Tgstation.Server.Api.Routes.Configuration, Tgstation.Server.Api.Routes.ConfigurationFile, and Tgstation.Server.Api.Models.ConfigurationFile.Path.

+
58  {
59  if (file == null)
60  throw new ArgumentNullException(nameof(file));
61  return apiClient.Read<ConfigurationFile>(Routes.ConfigurationFile + SanitizeGetPath(file.Path), instance.Id, cancellationToken);
62  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 27 of file ConfigurationClient.cs.

+
28  {
29  if (path == null)
30  path = String.Empty;
31  if (path.Length == 0 || path[0] != '/')
32  path = '/' + path;
33  return path;
34  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.ConfigurationClient.apiClient
+
+private
+
+ +

The IApiClient for the ConfigurationClient

+ +

Definition at line 16 of file ConfigurationClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.ConfigurationClient.instance
+
+private
+
+ +

The Instance for the ConfigurationClient

+ +

Definition at line 20 of file ConfigurationClient.cs.

+ +
+
+
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..ad515c4a08 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client-members.html @@ -0,0 +1,118 @@ + + + + + + +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..e66efa4d22 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html @@ -0,0 +1,412 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 26 of file DreamDaemonClient.cs.

+ +

References Tgstation.Server.Api.Routes.DreamDaemon.

+
27  {
28  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
29  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
30  }
readonly IApiClient apiClient
The IApiClient for the DreamDaemonClient
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.DreamDaemonClient.DreamDaemon (Routes. DreamDaemon,
dreamDaemon??throw new  ArgumentNullExceptionnameof(dreamDaemon),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.DreamDaemonClient.Read (CancellationToken cancellationToken)
+
+ +

Get the DreamDaemon represented by the IDreamDaemonClient

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.DreamDaemonClient.Restart (CancellationToken cancellationToken)
+
+ +

Restart DreamDaemon

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Client.Components.DreamDaemonClient.Shutdown (CancellationToken cancellationToken)
+
+ +

Shutdown DreamDaemon

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.DreamDaemonClient.Start (CancellationToken cancellationToken)
+
+ +

Start DreamDaemon

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.DreamDaemonClient.Update (DreamDaemon dreamDaemon,
CancellationToken cancellationToken 
)
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.DreamDaemonClient.apiClient
+
+private
+
+ +

The IApiClient for the DreamDaemonClient

+ +

Definition at line 15 of file DreamDaemonClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.DreamDaemonClient.instance
+
+private
+
+ +

The Instance for the DreamDaemonClient

+ +

Definition at line 19 of file DreamDaemonClient.cs.

+ +
+
+
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..89c01de1e9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html @@ -0,0 +1,422 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Routes.DreamMaker, Tgstation.Server.Api.Models.Internal.CompileJob.Id, Tgstation.Server.Api.Routes.List(), and Tgstation.Server.Api.Routes.SetID().

+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.DreamMakerClient.Compile (CancellationToken cancellationToken)
+
+ +

Compile the current repository revision

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<DreamMaker> Tgstation.Server.Client.Components.DreamMakerClient.DreamMaker (Routes. DreamMaker,
dreamMaker??throw new  ArgumentNullExceptionnameof(dreamMaker),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<CompileJob> Tgstation.Server.Client.Components.DreamMakerClient.GetCompileJob (CompileJob compileJob,
CancellationToken cancellationToken 
)
+
+ +

Get a compileJob

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
Task<DreamMaker> Tgstation.Server.Client.Components.DreamMakerClient.Read (CancellationToken cancellationToken)
+
+ +

Get the DreamMaker information

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.DreamMakerClient.apiClient
+
+private
+
+ +

The IApiClient for the DreamMakerClient

+ +

Definition at line 16 of file DreamMakerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.DreamMakerClient.instance
+
+private
+
+ +

The Instance for the DreamMakerClient

+ +

Definition at line 21 of file DreamMakerClient.cs.

+ +
+
+
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..018baa2442 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client-members.html @@ -0,0 +1,120 @@ + + + + + + +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..42ea9380f3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html @@ -0,0 +1,481 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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. Delete action cancels the current 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&#39;s DreamDaemon game server. Create action starts the server...
Definition: DreamDaemon.cs:8
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.InstanceClient.apiClient
+
+private
+
+ +

The IApiClient for the InstanceClient

+ +

Definition at line 39 of file InstanceClient.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
IByondClient Tgstation.Server.Client.Components.InstanceClient.Byond
+
+get
+
+ +

+ +

Definition at line 13 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IChatBotsClient Tgstation.Server.Client.Components.InstanceClient.ChatBots
+
+get
+
+ +

+ +

Definition at line 28 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IConfigurationClient Tgstation.Server.Client.Components.InstanceClient.Configuration
+
+get
+
+ +

+ +

Definition at line 22 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDreamDaemonClient Tgstation.Server.Client.Components.InstanceClient.DreamDaemon
+
+get
+
+ +

+ +

Definition at line 19 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDreamMakerClient Tgstation.Server.Client.Components.InstanceClient.DreamMaker
+
+get
+
+ +

+ +

Definition at line 31 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IJobsClient Tgstation.Server.Client.Components.InstanceClient.Jobs
+
+get
+
+ +

+ +

Definition at line 34 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Client.Components.InstanceClient.Metadata
+
+get
+
+ +

+ +

Definition at line 10 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IRepositoryClient Tgstation.Server.Client.Components.InstanceClient.Repository
+
+get
+
+ +

+ +

Definition at line 16 of file InstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IInstanceUserClient Tgstation.Server.Client.Components.InstanceClient.Users
+
+get
+
+ +

+ +

Definition at line 25 of file InstanceClient.cs.

+ +
+
+
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..7e08cd2db4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client-members.html @@ -0,0 +1,120 @@ + + + + + + +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..75aad67f6b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html @@ -0,0 +1,521 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 27 of file InstanceUserClient.cs.

+ +

References Tgstation.Server.Api.Routes.InstanceUser, Tgstation.Server.Api.Routes.List(), Tgstation.Server.Api.Routes.SetID(), and Tgstation.Server.Api.Models.InstanceUser.UserId.

+
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
readonly IApiClient apiClient
The IApiClient for the InstanceUserClient
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.Create (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Create a instanceUser

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.InstanceUserClient.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
+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.GetId (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Get a specific instanceUser

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser (Routes. InstanceUser,
instanceUser??throw new  ArgumentNullExceptionnameof(instanceUser),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser (Routes. InstanceUser,
instanceUser??throw new  ArgumentNullExceptionnameof(instanceUser),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + +
Task<IReadOnlyList<InstanceUser> > Tgstation.Server.Client.Components.InstanceUserClient.List (CancellationToken cancellationToken)
+
+ +

Get the InstanceUsers in the Instance

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.Update (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Update a instanceUser

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.InstanceUserClient.apiClient
+
+private
+
+ +

The IApiClient for the InstanceUserClient

+ +

Definition at line 16 of file InstanceUserClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.InstanceUserClient.instance
+
+private
+
+ +

The Instance for the InstanceUserClient

+ +

Definition at line 20 of file InstanceUserClient.cs.

+ +
+
+
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..2656499298 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html @@ -0,0 +1,347 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 27 of file JobsClient.cs.

+ +

References Tgstation.Server.Api.Models.Internal.Job.Id, Tgstation.Server.Api.Routes.Jobs, Tgstation.Server.Api.Routes.List(), and Tgstation.Server.Api.Routes.SetID().

+
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
readonly IApiClient apiClient
The IApiClient for the JobsClient
Definition: JobsClient.cs:16
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.JobsClient.Cancel (Job job,
CancellationToken cancellationToken 
)
+
+ +

Cancels a job

+ +

Implements Tgstation.Server.Client.Components.IJobsClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.JobsClient.GetId (Job job,
CancellationToken cancellationToken 
)
+
+ +

Get a job

+ +

Implements Tgstation.Server.Client.Components.IJobsClient.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.JobsClient.apiClient
+
+private
+
+ +

The IApiClient for the JobsClient

+ +

Definition at line 16 of file JobsClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.JobsClient.instance
+
+private
+
+ +

The Instance for the JobsClient

+ +

Definition at line 20 of file JobsClient.cs.

+ +
+
+
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..ebfa50102b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client-members.html @@ -0,0 +1,118 @@ + + + + + + +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..a660b75b84 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html @@ -0,0 +1,448 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.RepositoryClient.RepositoryClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a RepositoryClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instance
+
+
+ +

Definition at line 26 of file RepositoryClient.cs.

+ +

References Tgstation.Server.Api.Routes.Repository.

+
27  {
28  this.apiClient = apiClient;
29  this.instance = instance;
30  }
readonly Instance instance
The Instance for the RepositoryClient
+
readonly IApiClient apiClient
The IApiClient for the RepositoryClient
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Clone (Repository repository,
CancellationToken cancellationToken 
)
+
+ +

Clones a repository

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+ +
+
+ + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Delete (CancellationToken cancellationToken)
+
+ +

Deletes the Repository

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+ +
+
+ + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Read (CancellationToken cancellationToken)
+
+ +

Get the Repository represented by the IRepositoryClient

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Repository (Routes. Repository,
repository ,
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Repository (Routes. Repository,
repository??throw new  ArgumentNullExceptionnameof(repository),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Update (Repository repository,
CancellationToken cancellationToken 
)
+
+ +

Update the Repository

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.RepositoryClient.apiClient
+
+private
+
+ +

The IApiClient for the RepositoryClient

+ +

Definition at line 15 of file RepositoryClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.RepositoryClient.instance
+
+private
+
+ +

The Instance for the RepositoryClient

+ +

Definition at line 19 of file RepositoryClient.cs.

+ +
+
+
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..5087cf0c37 --- /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,110 @@ + + + + + + +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..eedfcda14c --- /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,145 @@ + + + + + + +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

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Client.Components.Tests.TestDreamDaemonClient.TestStart ()
+
+ +

Definition at line 17 of file TestDreamDaemonClient.cs.

+ +

References Tgstation.Server.Api.Routes.DreamDaemon.

+
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
+
+
+
+
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..add351fdb3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception-members.html @@ -0,0 +1,119 @@ + + + + + + +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..bcd9122694 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html @@ -0,0 +1,288 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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  { }
+
+
+ +
+
+ + + + + + + +
Tgstation.Server.Client.ConflictException.ConflictException ()
+
+ +

Construct a ConflictException

+ +

Definition at line 23 of file ConflictException.cs.

+
23 { }
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..08f379e3fe3c6f842ba98ea40a75bcde6d6d235d GIT binary patch literal 1141 zcmeAS@N?(olHy`uVBq!ia0vp^pMki8gBeJ&p4H_CQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;qP%K>HKH1W%+-7J8yq``~LZn zlg@p4$zN>Xed)QW@@AF4jZKl0{%FroJ-PqgnbVteia8(TmoU%p5jMJ?_u0|^M2-7A zzACq8FK#m!Ys_E-DkK`)Ed%=W$eAZu19`MsX6V*Ks)@Ac1SR{BqxcQNhu z=TNm{W_uM>Zx%{rme22BCc0Tg_REZVA*4t!rDF9&-7nklF~NmTOv*{L-&&g2_tt@|ce8N7v z^R>^kVvpb2wk>^YZEEoPUq>qIx^8~Uz05H?FXMc}+qt3g8-i~hJC;;CHO+Y2&2yg@ zN*b~L_V8QV}lP}!dmOk(KuYcQo zVlOkK&0)W5kRQK(zKGqYh<|H0zy73pu&jR5ZkdHMSNXnud^P-@;p8XZR@R=bN%B_O zestD#zovCF<+n{Zqp*=bc|veXxsv@Y{nV9hJHK7sm^trTo$Ov-jyGED&+a~!^E|(K zsh@*#wROTet*-~}#QC`Vw3+_3dVOiLU80%FvQ4|rRI}{v|MRG0r$ybwpA$aUo)w?j zzBN{T+sZA6?qvIKeY|a5T;jXAz4wjd=RdbAp1LkMH~RMGTX}y=XZBA~J-PUE&AFW4 z+g{fBa&JjLV0LB||BaP7$;=z}d9|miMf=-6Ngrl!z8eZGBN#kg{an^LB{Ts5Ae&FP 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..3b7ef1dc48 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_http_client-members.html @@ -0,0 +1,114 @@ + + + + + + +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..0b13cba727 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_http_client.html @@ -0,0 +1,277 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Client.HttpClient.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<HttpResponseMessage> Tgstation.Server.Client.HttpClient.SendAsync (HttpRequestMessage request,
CancellationToken cancellationToken 
)
+
+ +

Send an HTTP request

+ +

Implements Tgstation.Server.Client.IHttpClient.

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.HttpClient.Timeout
+
+getset
+
+ +

+ +

Definition at line 13 of file HttpClient.cs.

+ +
+
+
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..891762cf59 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html @@ -0,0 +1,499 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.InstanceManagerClient.InstanceManagerClient (IApiClient apiClient)
+
+ +

Construct an InstanceManagerClient

+
Parameters
+ + +
apiClient
+
+
+ +

Definition at line 28 of file InstanceManagerClient.cs.

+ +

References Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Routes.InstanceManager, Tgstation.Server.Api.Routes.List(), and Tgstation.Server.Api.Routes.SetID().

+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Instance.Id.

+
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  return client;
59  }
+
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.CreateOrAttach (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Create or attach an instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.InstanceManagerClient.Detach (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Deletes an instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.GetId (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Get a specific instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.Instance (Routes. InstanceManager,
instance??throw new  ArgumentNullExceptionnameof(instance),
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.Instance (Routes. InstanceManager,
instance??throw new  ArgumentNullExceptionnameof(instance),
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Instance> > Tgstation.Server.Client.InstanceManagerClient.List (CancellationToken cancellationToken)
+
+ +

Get all IInstanceClients for Instances the user can view

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.InstanceManagerClient.apiClient
+
+private
+
+ +

The IApiClient for the InstanceManagerClient

+ +

Definition at line 17 of file InstanceManagerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<long, IInstanceClient> Tgstation.Server.Client.InstanceManagerClient.cachedClients
+
+private
+
+ +

Map of already created IInstanceClients

+ +

Definition at line 22 of file InstanceManagerClient.cs.

+ +
+
+
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..51b1a7da9f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception-members.html @@ -0,0 +1,118 @@ + + + + + + +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..7cdaee741c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html @@ -0,0 +1,249 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..090a78a265d9ed82828f354d936fb87340df927c GIT binary patch literal 1468 zcmeAS@N?(olHy`uVBq!ia0y~yVDtd8J2;qu>ii?KlD>leK~7))Sjg$o*yrNrF(N{&6MNMKmGlwy~XpA?2be? zy|24h+_LWyS${#z)BHhS^^;loyYISXKaZG{cR=?03AZOo*MTND|GFfny3EzG>nRH@7`pUPfU*>At{JJ5xM`&kxjp8R6;j&2zMFOSr6Q?h|n|65Rv$Bbc zixot^q6 zJ)&aG`vmcuXHu(kUK^F%(MikiTVJ#LD!+-r#jcpFjzfik7QmDt9(!VD?at>f%av~L z>zg6Ic>caVs}9NfCx>Q9vi{1ph_gT1-Fb9nxl+H};ZJU_xwN-EpxRrq-SOpm?WApY`(Zd$~x#Yg^x zJo#-~q_b&eQ2Z^!Z;LP8Gx~m3&Qj#(qAlD + + + + + +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..b54f5a1202 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html @@ -0,0 +1,249 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..127df8755a6ef5a06b00520d4a93a4dbad475b66 GIT binary patch literal 1445 zcmb`HX;4#F6vtm0q6~%N5G5V7f+I9gbTFUy`9-A6yMHC{^ma-&F6J!&J;!+R^ z7{DSZv z$=?;a-Nwqn3IG5baK{!Z0HDZb&a*_D_d4;4G4t`|uHf*kCX>mGlbYE>MIFUv`VeBV z7?VHZXueveP(#B2bJD`-YC1#2u4}xrM931v zq{#Cea^s(d%&R>Fii8B-2F!Qd)6OmpWbk1un_DVHoZX6yAhoJe?_N&^H;&KiNE9yO zoAwqDsz!E=LWXt*8B4Dy=;M*JecFLA*OD3!)~$Ks+TI5}Om}MA=5x;3zqLZ_8BJtO zs&`s~%T((K-J~{zghD&HvY~qA=)ok+))73*p6Y7 zY@LdXsBu2|2uZiNSc(ACgN~GyF#3Kh8_3Z7mq$5d?2o*5RiIcJ4tjD+#s9QyC0tTN z(&51jJLKUzyxV^Di zwXLi@|IeO2>2$!mxfP=W7UkRg43&YGAMm@5`Xtw>d>cGoefvUvmFInRRMMrzJ!07& zyAoB$O)0ZAv{Q=%o5LHUSN%T4ID~_q!vlG|%GaAH(GDb^_Ky^455AA~(6CJ-G!nb> zsL;3nuZ=}<2bz-aU9`uF+=YUqcPhdMwK-m8H6kZf@@gtK2WyH^IO>Bq<<8mX4(k&W zH*<4vM6=mUX_}qf>5ooW&|fuGuZRrc34Q{ay=(z=aR&nQl2+PV7E2ajcCQn~4o2%O zp8gLC|GRNmhuO8I2Ls()Fc>l5-0+F9swV0$d@au870GF_aySr(ofzD`kG092-S?I{ zD2bBQ+P;rZdIM3~I2Om}iCr^qqFhC;4H8aArO3NnYouo~e%Zqug3&&z2=P6o7e9Ut zt(sI+nDEGptx)7ciN;dQ42a|3k%VDWb6c zXcMDV!n9%zACPL(mai>@zL`UWtJp8KDMrQ@T>-{sqK*7X_bLDBG>Mc^6|Ez_%C6pv zWA-ayW3r|`OhgkAbm>OUK=+-qf=b7zyXhvsq$EFm9IWJv(vg!TaV*2#L$`fL4+bUf zE|^M%8UB#yW^IGNyz|VE)KhM?rPgd9fSHT!eB3QF&r|^18oK4i<^#EZ1Ki^B AnE(I) literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception-members.html new file mode 100644 index 0000000000..56b41b036f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception-members.html @@ -0,0 +1,119 @@ + + + + + + +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..44d1327d32 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html @@ -0,0 +1,279 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
Tgstation.Server.Client.RateLimitException.RateLimitException ()
+
+ +

Construct an RateLimitException

+ +

Definition at line 17 of file RateLimitException.cs.

+
17 { }
+
+
+ +
+
+ + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Client.RateLimitException.RetryAfter
+
+getprivate
+
+ +

Definition at line 12 of file RateLimitException.cs.

+ +
+
+
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..0bb125be2d581be6e4b336349d431658344d4833 GIT binary patch literal 1159 zcmeAS@N?(olHy`uVBq!ia0vp^zks-dgBeKvyuo%9NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?!ghkA=0f<8M458k~!-xmCDQ77cT!&_gr4JZ?3e* zrT=TDFYvw;qyM~4_t&qFg?pk|bL3zC+*unx|I8ef+SPHDucAZq3y!-_dSg&L>C4=z zm$CQHe>vekwL?!E!d-u1dx?dke$C>;|4+ZDp1r&9`hS66VRt6;{r`Br?1z1`o@aX1 zasH|W>_Dr7;cgJFjhuFLDZ{<#`uUF&V`Z2Ik5KdCykyhlz}?!bH|*#onQ#}9a; zrlo$=6!ZMF!eP2fK39q7r)7M$x%HFIX!M`YKWn|&Z_>Mr?Xo|u)Sj6wR#3fJDE0Eq zmEWSGyHrY}p672$zdf;X-tG-MH(p+P((;$_%IsU)WoFmkep9C6{_JgL?)lw`wxP3c zU7x+aW=go(@88OfzxkL~>s`wJQo41@nSdb4V+!e7>urtFob<(X!`{AL)_byI`$dB{ zj!Vy6I4!5T;9{JZoo7~xym~~aYWz)^^1nB>+|CzzXi#V?|pHJpO#vv+3@`(|*zJ_7BS)*gq^I9#=F6d7WJD!5}C4g5jPB5Kp;Se3|(aC{7-WeC=j9 zb}QF?-?vV+wyghEO1mXnd2bYo?Y8{-uXeks!_v}!YSr6hXGU+ixK6!t|JLu7Z+L(G zEB-$5r0Lw_`*X{zw<(`b{b=?zaohYgb65GkeSJ3EZU^(;d$*RQl}-L5U0=JEWo~5TF1GmAE7o%xBGP56K4ui(t={&5 zGXoe;FHC3c+>!ob!kZJ`vmRO4nq`~1m^(z@oV$2BM_2!zg0?z~JU`p;oOCm{_kIg< z{`SAP-1Po;(9!U9yItkxR7Iz%v)ZrQzqv_X_FpV=gz5f}E|(3m{WazMyI+>O-hNo- zXcl`Zj^}ppYPrPaKBC)Y_q{Irxit6R(iY(<8_Rw!zSwX5$KspR-%srV56oXSEq2Y1 zmN<}qRsCY|NrpdVwPLad+F@D5uI^i~*U82Im?Pe%-d?!3`5ds+VDNPHb6Mw<&;$VV C$wGtx 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..c6d340736d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception-members.html @@ -0,0 +1,118 @@ + + + + + + +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..d09b1ccbb7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html @@ -0,0 +1,249 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..ec665b42ea5108b54468bff68ed4155f113a23d1 GIT binary patch literal 1388 zcmbu9e^8Ql9LFCsr`b%)t)_=rlSPzf{-|XUY^KqpOC8y!Wd3L?a?HFED}x@rRytdg z#mXO@%D7RjL&WCL8H!lu%AYF}5KYTpr1+Q!0S`REa9g+SZhvjxyYKh&zWe^T_kCWU z&$loxhV16*?Fs;Z8@MZi0ss!acKxM`qkWyM@ZD$+Z^eBOA8E7M?DE<4i){AoZ|v&# zDU->Z3J2#exG*R&djR{P`O()N9}EBsEnvj^@h2VN3Yc?d%NtJHaC>!Dc4LtX7VCWT zIE_IsiWHoUKGutvqlMypD!n57GJh55IYQZv=^{23-NjMwhT32HfyD#8Ish~u z9U3Qdx)C5O)0kyLD%W--QK5GD1d`iKZ^urS4q>*XM=`7k! zrP1SXU~`AW$nEYK@rMp+=$pT`HgbQlveIk_9V!+xjzOn$#cIXyoF7AGg$_=p!oq2eBL<54!&4vd|ZtoAC^tK0OqnR-qn)v z#%Joy1fxUJP60xVDrtG#R^wwFw=Pw#c)^25uU2PM2w&w8hW&}u(g-*EL!(Y4;~M_M zq;)FMn$*4qsU$taTu;VWh7{RB*Sv~(ymXafVvr6QA`DfuMdJMPd`B1thb8B9{)Yx~ z>vk3xVuCO8@ght5sV4uL+K&{i#;x)dJ?Q6ea!p}vp&bp{kV5lO(shl%S8}Iy811YZ zl8%hBPJ4$`i~2*&X`~(_w}Bf2|14D{)JrSx>V?V5Tx%8yM*1)=1$%h=3t+E@@V<-( z-n|o#<>Cy!I*9#JJ%(PPtpjmMx-5@(KpV~)DGxL?98Tg8FAQsIyAwfkt~MINPKuV= z(Z5RSJotA>V!8Kc!tB>%IIWWhaLo>IT(kZRfU%Qrm@Hfc>_CC?rQ7}=+<&bWwr)=p zo_C3IEe=>9JNu8?Nqku)*;JEaf#Ko7QPVP6`8;fL3)VUB;y%^K?2_jbl?u&PW#~rY za};=eup`iw`U&l+fGg;0`nB4Jn%c~Ac86B(m=juNSQb0;MKx}1);Wsa$585*@u9DZ zm^?)#pU@c0GgZ<6XoYmEGQ93Y-J<~$aSC*1l8gy!yCTz?ujK7j%dc-j+FDi~)%Pm0 zr(0ImAzs1hp2@fK?`=MH7~$7v?EHe;)V5ud*d^pGz#PtuMH%Z;ALDKn)ZQCni?S{^ z$_KDxKN)>Op)1LOi#sj-Axcd`3PD%9msLvYk~DF7?C-g}Zpf;Kidq7Zu>C2c`6^IZ ze?i{ysTHHv+`N@$)o+_&SWC--G8-04r__iw#MpboN1;$w+&2eXdKljYR*5EOj;GnQ zkV+@$?{^ LGA5!rJoU_PuxZWx literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_server_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_server_client-members.html new file mode 100644 index 0000000000..57bc5bb7ef --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_server_client-members.html @@ -0,0 +1,121 @@ + + + + + + +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..b9cc7a1e42 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_server_client.html @@ -0,0 +1,486 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Token.Bearer, Tgstation.Server.Client.IApiClient.Headers, Tgstation.Server.Api.Routes.Root, and Tgstation.Server.Api.ApiHeaders.Token.

+
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  }
+ +
readonly IApiClient apiClient
The IApiClient for the ServerClient
Definition: ServerClient.cs:45
+ +
Represents a JWT returned by the API
Definition: Token.cs:8
+
string Token
The client&#39;s JWT
Definition: ApiHeaders.cs:76
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
IInstanceManagerClient Instances
Definition: ServerClient.cs:34
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
void Tgstation.Server.Client.ServerClient.AddRequestLogger (IRequestLogger requestLogger)
+
+ +

Adds a requestLogger to the request pipeline

+ +

Implements Tgstation.Server.Client.IServerClient.

+ +
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Client.ServerClient.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + + + + +
Task<ServerInformation> Tgstation.Server.Client.ServerClient.Version (CancellationToken cancellationToken)
+
+ +

The ServerInformation of the IServerClient

+ +

Implements Tgstation.Server.Client.IServerClient.

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.ServerClient.apiClient
+
+private
+
+ +

The IApiClient for the ServerClient

+ +

Definition at line 45 of file ServerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Token Tgstation.Server.Client.ServerClient.token
+
+private
+
+ +

Backing field for Token

+ +

Definition at line 50 of file ServerClient.cs.

+ +
+
+ +
+
+ + + + +
Uri Tgstation.Server.Client.ServerClient.Url => apiClient.Url
+
+ +

+ +

Definition at line 13 of file ServerClient.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
IAdministrationClient Tgstation.Server.Client.ServerClient.Administration
+
+get
+
+ +

+ +

Definition at line 37 of file ServerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IInstanceManagerClient Tgstation.Server.Client.ServerClient.Instances
+
+get
+
+ +

+ +

Definition at line 34 of file ServerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.ServerClient.Timeout
+
+getset
+
+ +

+ +

Definition at line 28 of file ServerClient.cs.

+ +

Referenced by Tgstation.Server.Client.ServerClientFactory.CreateServerClient().

+ +
+
+ +
+
+ + + + + +
+ + + + +
Token Tgstation.Server.Client.ServerClient.Token
+
+getset
+
+ +

+ +

Definition at line 17 of file ServerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IUsersClient Tgstation.Server.Client.ServerClient.Users
+
+get
+
+ +

+ +

Definition at line 40 of file ServerClient.cs.

+ +
+
+
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..b6862e0ae5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html @@ -0,0 +1,337 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Routes.Root.

+
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  return CreateServerClient(host, token, timeout);
50  }
static readonly IApiClientFactory apiClientFactory
The IApiClientFactory for the ServerClientFactory
+
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
+
async Task< IServerClient > CreateServerClient(Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)
Create a IServerClient
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
IServerClient Tgstation.Server.Client.ServerClientFactory.CreateServerClient (Uri host,
Token token,
TimeSpan timeout 
)
+
+ +

Create a IServerClient

+ +

Implements Tgstation.Server.Client.IServerClientFactory.

+ +

Definition at line 53 of file ServerClientFactory.cs.

+ +

References Tgstation.Server.Api.Models.Token.Bearer, and Tgstation.Server.Client.ServerClient.Timeout.

+
54  {
55  if (host == null)
56  throw new ArgumentNullException(nameof(host));
57  if (token == null)
58  throw new ArgumentNullException(nameof(token));
59  var result = new ServerClient(apiClientFactory.CreateApiClient(host, new ApiHeaders(productHeaderValue, token.Bearer)), token);
60  if (timeout != default)
61  result.Timeout = timeout;
62  return result;
63  }
static readonly IApiClientFactory apiClientFactory
The IApiClientFactory for the ServerClientFactory
+
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
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClientFactory Tgstation.Server.Client.ServerClientFactory.apiClientFactory = new ApiClientFactory()
+
+staticprivate
+
+ +

The IApiClientFactory for the ServerClientFactory

+ +

Definition at line 16 of file ServerClientFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ProductHeaderValue Tgstation.Server.Client.ServerClientFactory.productHeaderValue
+
+private
+
+ +

The ProductHeaderValue for the ServerClientFactory

+ +

Definition at line 21 of file ServerClientFactory.cs.

+ +
+
+
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..62467e1045 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html @@ -0,0 +1,282 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
Tgstation.Server.Client.ServerErrorException.ServerErrorException ()
+
+ +

Construct an ServerErrorException

+ +

Definition at line 20 of file ServerErrorException.cs.

+
20 { }
+
+
+ +
+
+ + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Client.ServerErrorException.Html
+
+get
+
+ +

The raw HTML of the error

+ +

Definition at line 15 of file ServerErrorException.cs.

+ +
+
+
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..05645b97047b8c488ed113fc69017c66805b49a0 GIT binary patch literal 1225 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|J2;quC zx}0&_VbVTt{bh=txqJDK?#?(9A3uA+o5`O{eeOT~{zw0d=cVi~^Y#YzIiD>5Ew$uF zi=Agx=e-c~X;beDgy#4yPBr_3ZF8-Y>|NSbcBOZ|@8UUK$L4`jY>%LrC9WqG>?1W|K7b<$bpO!hJO(oTc_ws}#KEl0)GVZHQ8u%|TA28x= zi0W@IoWXX$Q<&$m0dIp#TA~!gOrOIh3`Rih3@Jb@3@1{gmN8B^Y2w4IFgbGun*+#K z4L-}TDxB|;EOY!~l+4{z$1$G30%Fi+)c#>TTXxw5&l zbv!&j?(7Mflx6z;*iBDY=ShCEep{!<=NfYsjFX?U(wd-wX%gYR>ueeAtyaMajN&F_7^`_ywBW{>2+!OE9;CkyZtBq)2-#^_57s@ zi8ydbW-c-Wrm?AP9~i3`B9<`*y#8pwcbUN=vnf#q7)d8|h>0YevH4gyljpEOgm*H- zhEwMZfKl%Oj{3}{8?S{V)PLK5dHtMQKUEuIx^tgpzkN|W{pc<0TR!S6iQS>$Yva8Dqcl?OD zzUgvofvNRv+m?&G|BQ-eyi=Mx>sSuAbA`l>`3V~iMc==x(AHDlt=xO-dht7^Ew@(i zy`69%HSf1IXRqxp+x|1fqJjojy6UA(`j#(0em6`q>BPy58UIXTXPsm16$r7^x^8mq zt;FHmO<5Oi$jE1(+`GGbg8yQ}^N&mXFJ{b}QhalD(7p3jrLl9qA1l=Vw(Irc!dc5_ zt($(V_U?(y5QWW4v*zr2ey8-}3eRn?j+uhu@mICRp|6T-^%`GfzK_aHVz_vHTlele zb6>j|-2%pBNtV?4m>UfL7v%+6U$O}EXpmo`p1DSv`vLo_NGXQ>VTcUlYtoh|vF6f0 Z=4tJ@b$2!VB!J}(gQu&X%Q~loCIC0fO?dzS 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..22f15af618 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception-members.html @@ -0,0 +1,118 @@ + + + + + + +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..8e1547ade7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html @@ -0,0 +1,249 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..7758e0c8d4fe4fa79b4020a5333866fcd885a794 GIT binary patch literal 1421 zcmcIkeN>WH9DYgDtk@s3)cmR~)T3*frBuhy@&jIHT1Zx)^r4wZZ)hsTK%`tVn_A*W zhG{#6*;GoySImzjt=#NGgun?2XIeHC#4_2+ioNWtKlb;|?m73~=ic8vzw_MR^W0ms zBMygN>bw*H05ph?Bme*ki{LX$tdNnU*yMvuPCH_WQD(ClfxqkLbI>1FOH&LIHvqt5S1@ub@dV0HYv4`zEMHs`u}fnvqkEP@Ctnrb5@R*| zjW6mjdmN+=vlmFTKv>B?=>tadZlplGiU%r;cL@vhPv&dH=0u|x~q;}zPQHLSkxWe7e(S)TfW2x_g@8^rOhm= z%I5q76(HN=67Ed1!lyt0wHdvp1V#y3vD^UVe+f=LQDq1fPf0YJM$9U(v-DHF5dPHW z?K~LkZHs0QpuCtJyAS< zR#5uqTsSCt_vBzz52VYHYwzMcbj4wEht$}nH|gu=*h<&A0-UPqo~`O#b&HoZRB)Y6 z4N4LiYGx9Lu0U;SanZt5XvwIrZ0B$uPW@JcRVtmdzA~pSF@ETvisGk-^1mSmgZ;x# zYvZ&02jtD8_9=2#`v&{$uUUU&Jz~*=HiH8QbJ}w__ajEPZ`{0UzEJhrh~v#jcEgWP z`+;T$t-=%Rb+UNyQ%x-_@fu-tX$3VTo(MA3EeG?UHweiaZZ zk^L{CTfFpaFWI}knh^6#IBGpG@^2sU_o~_9z%=}k&2gC?3$+aJH@U#GotB^fFUEj(>lFlgDI4;!o8s));3d8hUKQ1UXD>&Q~8zmhTik@6Q+s2 z4}(an>-d~L&B~QED(MNyEyt13lX$ zN0=N&tJ{OF=r<}=(ghh@B<^?P6n9RwpFMDD(W|M+5NUf_l2`Dc>tPbt;ste@t&fDe z`FSEaO!~M*P2Snxt!BXDmm$$;IB=fb47uIqr*LNRYF>xd$dCymD3^~keMw?^Wo=p=A9v^(Da< zW5+gLulwGO4#mr;Tiq`SCXg$SPcE8m+L9%uO^aDvEuNrGY6N;OHe&&+% + + + + + +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..5c14565469 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html @@ -0,0 +1,170 @@ + + + + + + +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

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Client.Tests.TestApiClient.TestDeserializingByondModelsWork ()
+
+ +

Definition at line 21 of file TestApiClient.cs.

+ +

References Tgstation.Server.Api.Routes.Byond.

+
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
+
+
+
+ +
+
+ + + + + + + +
async Task Tgstation.Server.Client.Tests.TestApiClient.TestUnrecognizedResponse ()
+
+ +

Definition at line 49 of file TestApiClient.cs.

+ +

References Tgstation.Server.Api.Routes.Byond.

+
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
+
+
+
+
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..9d9518d57c --- /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,110 @@ + + + + + + +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..b4ea8e9acb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html @@ -0,0 +1,139 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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..4626e5d014 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception-members.html @@ -0,0 +1,118 @@ + + + + + + +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..482b143b85 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html @@ -0,0 +1,249 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..857a4f5b8805cff89e23148e2841f90f487fe72d GIT binary patch literal 1345 zcmeAS@N?(olHy`uVBq!ia0y~yU=#wfJ2;quq)hUZ1|TI7;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z;eOU#WAFU@$KB(MN6y%SSBka{rf-p ze1*dW)<>J9v#a}JTZ;4+T~wVIwZ7-EMO&4jS5U-yjfpDCUMeR$gglKFxlHO=A7->i z&(rEj<#!v0Np=(U!<9Ur*R1Y;AN=XpuL!=&T{HK!J^%jY_t*7TJTFcE7`r;UFL1yV&Xc5ToVSrFT9N*O+N` z@?_`dkAePkihBPa@Zs*mrfPQKqb#()|wNSm@6PT3FyMdD^p~S8&2VVU|Ye^ zqQPkK=wpZQf@vCzYixRta0YlyVaVwaU{LmA=+R&_Sj2LmLx^(Dfhggw(bm{H+hNmnT>n5P3!tR0en^)p~mNs{Ha__Uu(t+ppaYj(&SJ{^*(S;)TWhb64E; zP|ZB9tGYgH=|U0SC~wXTw%eP#PZ}*XO|p*7f1T!2DZIOH*WrB;k>yj@)UIcK+q=+9 zQYCjqz5lXo>qlB?Csnf#f0;s~+ii-+Btg|lDK=9GcK$XGWMy`-*2w@7wj)nW6UCjkxIIqpx4D*!xeS>Z1I_xi1;E%A8%fX42o{?QBA8Th3}P46Dr8YrFMo+>5N- zx^23v!_Th%7<9iXd-eLe+FsMx_U`Sr+&L*+hi9q5hG{|_^&h^>Am$W=Z_L0?vxYMDh7;=D-KIMkh`s&kG@A(rrZiV!kO7`_Qc+L%Ckau zZRqJs_vTxeb#J;Eb*7~J=a<7dH=B10r{7WmB?`ZFPd*)B`@tD=CVzFxY%9h(srnU5 vbPXHkpPH}5_~R~0)Y?qtIc(5U^p}0@z5Llcaa&@5 + + + + + +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..0a045091aa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html @@ -0,0 +1,289 @@ + + + + + + +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 +Exception + +
+ + + + + + + + + + + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + +
Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException ()
+
+ +

Construct a UnrecognizedResponseException

+ +

Definition at line 28 of file UnrecognizedResponseException.cs.

+
28 { }
+
+
+ +
+
+ + + + + + + + +
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) { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..3ceebd68cef228c8d6bbb534a9cb65d54ac83611 GIT binary patch literal 1455 zcmb_ceNa+a9DS&jTBg-jT7o*Fn`t?k``iR6ODCU&HcB6AX6lBaU?RF&Sd!(Mt)zj8 z?#q};*lh|wQqwKVHdD$LYx5%ng^Ctq@T*W)1!P~l(@eX6cW3VJp7Xo+&N*}E%q`j- zzQe|PjWqxOHc)7ABmkg@2tI3Rj#N@E6oM@FyLXX7OePZo-;GRVl{_p(&_DCRg9i(W z2AvRUnHd=#1t5n$j=nCEF90kcK*2$z9Mou)HmxDRE`--CxNmah`&rn>I};tMO2Y0Y zepBQiZ%?F}1pP5YQIq@Di&$5PS5Jhx9)fNji{)k2UeqYgtrni-gMnMU9h3dc9IJ_^ zZ-P0Q-6!@a`qVnrT}xg-9HC3an4LGQlwmcP!3L1`XX}iNaPF(x=k8GRE1_O};{({i zmIpOrhw|Yum@Vn3qlLZry4dr?-mAAgpm9pX6{isxL5o_aCEQI$eLTL07R4b9hxcPC zKhVM=S0Q`R1~ej@{n1a|=LRugs;I9wMwa z$SoeXZ$u&YSYFf>&WjQH5d5Na#`9knsb(a|my_x6>E%8-{ZT3Rddja(AKl`lyu-Z0 z#~RP<8=>A5y~dNvtE+R+b1VNF{dk@uq zIh~Ht$^0X_Cyxm^lbdu9m?Q~SKD*P3RF z3zl!R)~__%I~&`r-D%l5eO5un^-oyrXfMc}Q>cdOn=~1Qn_PUvo22>E68AQ;v^#1d znst6g_lT^s7}EXKZgX19RP}1-{qa4&P1eizF500B&vKM5IbSX~No9oQ#*Nfd5*ce} zsw9CEyE^YU{(R$F1EY>5s|_0o`Ie78G?xH&NQtdU5O8+tSk1{kDQX^2n%&LaF1krdM|0{)%Pf| zg{n#g8rQyLIQjVCwVgqm_C3_LF?I zDTT3t%EIZiex`UBSomu7|6+lsmPelR5R_>Riv*NHkz;{h5c0bMP)K-i&9+1Ne*@>X BztjK# 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..6e94eb7371 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_users_client-members.html @@ -0,0 +1,118 @@ + + + + + + +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..3dd0dedfdd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_users_client.html @@ -0,0 +1,430 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.UsersClient.UsersClient (IApiClient apiClient)
+
+ +

Construct an UsersClient

+
Parameters
+ + +
apiClientThe value of apiClient
+
+
+ +

Definition at line 22 of file UsersClient.cs.

+ +

References Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Api.Routes.List(), Tgstation.Server.Api.Routes.SetID(), and Tgstation.Server.Api.Routes.User.

+
23  {
24  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
25  }
readonly IApiClient apiClient
The apiClient for the UsersClient
Definition: UsersClient.cs:16
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.Create (UserUpdate user,
CancellationToken cancellationToken 
)
+
+ +

Create a new user

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.GetId (User user,
CancellationToken cancellationToken 
)
+
+ +

Get a specific user

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +
+
+ + + + + + + + +
Task<IReadOnlyList<User> > Tgstation.Server.Client.UsersClient.List (CancellationToken cancellationToken)
+
+ +

List all Users

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +
+
+ + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.Read (CancellationToken cancellationToken)
+
+ +

Read the current user's information and general rights

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.Update (UserUpdate user,
CancellationToken cancellationToken 
)
+
+ +

Update a user

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.User (Routes. User,
user??throw new  ArgumentNullExceptionnameof(user),
cancellationToken  
)
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.User (Routes. User,
user??throw new  ArgumentNullExceptionnameof(user),
cancellationToken  
)
+
+private
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.UsersClient.apiClient
+
+private
+
+ +

The apiClient for the UsersClient

+ +

Definition at line 16 of file UsersClient.cs.

+ +
+
+
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..d2be9cb961 --- /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,322 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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  }
+ + +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Dispose ()
+
+ +

+ +

Definition at line 34 of file ByondExecutableLock.cs.

+
34 { }
+
+
+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamDaemonPath
+
+get
+
+ +

+ +

Definition at line 12 of file ByondExecutableLock.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamMakerPath
+
+get
+
+ +

+ +

Definition at line 15 of file ByondExecutableLock.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Version
+
+get
+
+ +

+ +

Definition at line 9 of file ByondExecutableLock.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_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..70aed7eaf7 --- /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,128 @@ + + + + + + +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..ff77999478 --- /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,790 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 89 of file ByondManager.cs.

+
90  {
91  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
92  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
93  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
94  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
95 
96  installedVersions = new Dictionary<string, Task>();
97  semaphore = new SemaphoreSlim(1);
98  }
readonly Dictionary< string, Task > installedVersions
Map of byond Versions to Tasks that complete when they are installed
Definition: ByondManager.cs:68
+
readonly ILogger< ByondManager > logger
The ILogger for the ByondManager
Definition: ByondManager.cs:63
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the ByondManager
Definition: ByondManager.cs:53
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the ByondManager
Definition: ByondManager.cs:73
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ByondManager
Definition: ByondManager.cs:58
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 176 of file ByondManager.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
177  {
178  if (version == null)
179  throw new ArgumentNullException(nameof(version));
180  var versionKey = VersionKey(version);
181  await InstallVersion(version, cancellationToken).ConfigureAwait(false);
182  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
183  {
184  await ioManager.WriteAllBytes(ActiveVersionFileName, Encoding.UTF8.GetBytes(versionKey), cancellationToken).ConfigureAwait(false);
185  await eventConsumer.HandleEvent(EventType.ByondActiveVersionChange, new List<string> { ActiveVersion != null ? VersionKey(ActiveVersion) : null, versionKey }, cancellationToken).ConfigureAwait(false);
186  ActiveVersion = version;
187  }
188  }
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:48
+
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:30
+
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&#39;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:73
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ByondManager
Definition: ByondManager.cs:58
+ +
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.ByondManager.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 109 of file ByondManager.cs.

+
110  {
111  var ourTcs = new TaskCompletionSource<object>();
112  Task inProgressTask;
113 
114  var versionKey = VersionKey(version);
115  bool installed;
116  lock (installedVersions)
117  {
118  installed = installedVersions.TryGetValue(versionKey, out inProgressTask);
119  if (!installed)
120  installedVersions.Add(versionKey, ourTcs.Task);
121  }
122  if (installed)
123  using (cancellationToken.Register(() => ourTcs.SetCanceled()))
124  {
125  await Task.WhenAny(ourTcs.Task, inProgressTask).ConfigureAwait(false);
126  cancellationToken.ThrowIfCancellationRequested();
127  return;
128  }
129  //okay up to us to install it then
130  try
131  {
132  await eventConsumer.HandleEvent(EventType.ByondInstallStart, new List<string> { versionKey }, cancellationToken).ConfigureAwait(false);
133  var downloadTask = byondInstaller.DownloadVersion(version, cancellationToken);
134 
135  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
136  await ioManager.CreateDirectory(versionKey, cancellationToken).ConfigureAwait(false);
137 
138  try
139  {
140  var download = await downloadTask.ConfigureAwait(false);
141  await ioManager.ZipToDirectory(versionKey, download, cancellationToken).ConfigureAwait(false);
142  await byondInstaller.InstallByond(ioManager.ResolvePath(versionKey), version, cancellationToken).ConfigureAwait(false);
143 
144  //make sure to do this last because this is what tells us we have a valid version in the future
145  await ioManager.WriteAllBytes(ioManager.ConcatPath(versionKey, VersionFileName), Encoding.UTF8.GetBytes(version.ToString()), cancellationToken).ConfigureAwait(false);
146  }
147  catch (WebException e)
148  {
149  //since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
150  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Error downloading BYOND version: {0}", e.Message));
151  }
152  catch (OperationCanceledException)
153  {
154  throw;
155  }
156  catch
157  {
158  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
159  throw;
160  }
161 
162  ourTcs.SetResult(null);
163  }
164  catch (Exception e)
165  {
166  if (!(e is OperationCanceledException))
167  await eventConsumer.HandleEvent(EventType.ByondInstallFail, new List<string> { e.Message }, cancellationToken).ConfigureAwait(false);
168  lock (installedVersions)
169  installedVersions.Remove(versionKey);
170  ourTcs.SetException(e);
171  throw;
172  }
173  }
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:48
+
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:68
+
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:53
+
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:58
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 204 of file ByondManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+
205  {
206  async Task<byte[]> GetActiveVersion()
207  {
208  if (!await ioManager.FileExists(ActiveVersionFileName, cancellationToken).ConfigureAwait(false))
209  return null;
210  return await ioManager.ReadAllBytes(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
211  }
212 
213  var activeVersionBytesTask = GetActiveVersion();
214 
215  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
216  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
217 
218  async Task ReadVersion(string path)
219  {
220  var versionFile = ioManager.ConcatPath(path, VersionFileName);
221  if (!await ioManager.FileExists(versionFile, cancellationToken).ConfigureAwait(false))
222  {
223  logger.LogInformation("Cleaning unparsable version path: {0}", ioManager.ResolvePath(path));
224  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false); //cleanup
225  return;
226  }
227  var bytes = await ioManager.ReadAllBytes(versionFile, cancellationToken).ConfigureAwait(false);
228  var text = Encoding.UTF8.GetString(bytes);
229  if (Version.TryParse(text, out var version))
230  {
231  var key = VersionKey(version);
232  lock (installedVersions)
233  if (!installedVersions.ContainsKey(key))
234  {
235  installedVersions.Add(key, Task.CompletedTask);
236  return;
237  }
238  }
239  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false);
240  };
241 
242  await Task.WhenAll(directories.Select(x => ReadVersion(x))).ConfigureAwait(false);
243 
244  var activeVersionBytes = await activeVersionBytesTask.ConfigureAwait(false);
245  if (activeVersionBytes != null)
246  {
247  var activeVersionString = Encoding.UTF8.GetString(activeVersionBytes);
248  if (Version.TryParse(activeVersionString, out var activeVersion))
249  ActiveVersion = activeVersion;
250  else
251  await ioManager.DeleteFile(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
252  }
253  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:48
+ +
const string ActiveVersionFileName
The file in which we store the VersionKey(Version) for the active installation
Definition: ByondManager.cs:30
+
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:68
+
readonly ILogger< ByondManager > logger
The ILogger for the ByondManager
Definition: ByondManager.cs:63
+
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
+
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Byond.ByondManager.StopAsync (CancellationToken cancellationToken)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 191 of file ByondManager.cs.

+
192  {
193  var versionToUse = requiredVersion ?? ActiveVersion;
194  if (versionToUse == null)
195  throw new JobException("No BYOND versions installed!");
196  await InstallVersion(versionToUse, cancellationToken).ConfigureAwait(false);
197 
198  var versionKey = VersionKey(versionToUse);
199 
201  }
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:48
+ +
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&#39;t already
+
string DreamDaemonName
Get the file name of the DreamDaemon executable
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the ByondManager
Definition: ByondManager.cs:53
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string Tgstation.Server.Host.Components.Byond.ByondManager.VersionKey (Version version)
+
+staticprivate
+
+ +

Converts a BYOND version to a string

+
Parameters
+ + +
versionThe Version to convert
+
+
+
Returns
The string representation of version
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
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 30 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Byond.ByondManager.BinPath = "byond/bin"
+
+ +

The path to the BYOND bin folder

+ +

Definition at line 21 of file ByondManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.PosixByondInstaller.InstallByond().

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondInstaller Tgstation.Server.Host.Components.Byond.ByondManager.byondInstaller
+
+private
+
+ +

The IByondInstaller for the ByondManager

+ +

Definition at line 53 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Byond.ByondManager.eventConsumer
+
+private
+
+ +

The IEventConsumer for the ByondManager

+ +

Definition at line 58 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<string, Task> Tgstation.Server.Host.Components.Byond.ByondManager.installedVersions
+
+private
+
+ +

Map of byond Versions to Tasks that complete when they are installed

+ +

Definition at line 68 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Byond.ByondManager.ioManager
+
+private
+
+ +

The IIOManager for the ByondManager

+ +

Definition at line 48 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<ByondManager> Tgstation.Server.Host.Components.Byond.ByondManager.logger
+
+private
+
+ +

The ILogger for the ByondManager

+ +

Definition at line 63 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Byond.ByondManager.semaphore
+
+private
+
+ +

The SemaphoreSlim for the ByondManager

+ +

Definition at line 73 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersion
+
+getprivate set
+
+ +

+ +

Definition at line 33 of file ByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IReadOnlyList<Version> Tgstation.Server.Host.Components.Byond.ByondManager.InstalledVersions
+
+get
+
+ +

+ +

Definition at line 37 of file ByondManager.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_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..adca439d74 --- /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,123 @@ + + + + + + +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
ByondRevisionsURLTgstation.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..63ae6bf453 --- /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,564 @@ + + + + + + +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 ByondRevisionsURL = "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 16 of file PosixByondInstaller.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 58 of file PosixByondInstaller.cs.

+
59  {
60  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
61  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
62  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
63  }
readonly ILogger< PosixByondInstaller > logger
The ILogger for the PosixByondInstaller
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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 66 of file PosixByondInstaller.cs.

+
67  {
68  try
69  {
70  await ioManager.DeleteDirectory(ByondCachePath, cancellationToken).ConfigureAwait(false);
71  }
72  catch (OperationCanceledException)
73  {
74  throw;
75  }
76  catch (Exception e)
77  {
78  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
79  }
80  }
+
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 83 of file PosixByondInstaller.cs.

+
84  {
85  if (version == null)
86  throw new ArgumentNullException(nameof(version));
87 
88  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURL, version.Major, version.Minor);
89 
90  return await ioManager.DownloadFile(new Uri(url), cancellationToken).ConfigureAwait(false);
91  }
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
readonly IIOManager ioManager
The IIOManager for the PosixByondInstaller
+
const string ByondRevisionsURL
The URL format string for getting BYOND linux version {0}.{1} zipfile
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 94 of file PosixByondInstaller.cs.

+ +

References Tgstation.Server.Host.Components.Byond.ByondManager.BinPath.

+
95  {
96  if (path == null)
97  throw new ArgumentNullException(nameof(path));
98  if (version == null)
99  throw new ArgumentNullException(nameof(version));
100 
101  //write the scripts for running the ting
102  //need to add $ORIGIN to LD_LIBRARY_PATH
103  const string StandardScript = "#!/bin/sh\nexport LD_LIBRARY_PATH=\"\\$ORIGIN:$LD_LIBRARY_PATH\"\nBASEDIR=$(dirname \"$0\")\nexec \"$BASEDIR/{0}\" \"$@\"\n";
104 
105  var dreamDaemonScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamDaemonExecutableName);
106  var dreamMakerScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamMakerExecutableName);
107 
108  async Task WriteAndMakeExecutable(string fullPath, string script)
109  {
110  await ioManager.WriteAllBytes(fullPath, Encoding.ASCII.GetBytes(script), cancellationToken).ConfigureAwait(false);
111  postWriteHandler.HandleWrite(fullPath);
112  }
113 
114  var basePath = ioManager.ConcatPath(path, ByondManager.BinPath);
115 
116  var task = Task.WhenAll(WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamDaemonName), dreamDaemonScript), WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamMakerName), dreamMakerScript));
117 
120 
121  return task;
122  }
+
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondCachePath = "~/.byond/cache"
+
+private
+
+ +

Path to the BYOND cache

+ +

Definition at line 25 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondRevisionsURL = "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 21 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonExecutableName = "DreamDaemon"
+
+private
+
+ +

Definition at line 27 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonName => DreamDaemonExecutableName + ShellScriptExtension
+
+ +

+ +

Definition at line 32 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerExecutableName = "DreamMaker"
+
+private
+
+ +

Definition at line 28 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerName => DreamMakerExecutableName + ShellScriptExtension
+
+ +

+ +

Definition at line 35 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ioManager
+
+private
+
+ +

The IIOManager for the PosixByondInstaller

+ +

Definition at line 40 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<PosixByondInstaller> Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger
+
+private
+
+ +

The ILogger for the PosixByondInstaller

+ +

Definition at line 50 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPostWriteHandler Tgstation.Server.Host.Components.Byond.PosixByondInstaller.postWriteHandler
+
+private
+
+ +

The IPostWriteHandler for the PosixByondInstaller

+ +

Definition at line 45 of file PosixByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ShellScriptExtension = ".sh"
+
+private
+
+ +

Definition at line 29 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..3d9238a5bc --- /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,113 @@ + + + + + + +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..e213056112 --- /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,197 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+
+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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..be7bbb40d7 --- /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,126 @@ + + + + + + +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
ByondRevisionsURLTgstation.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..07b0163248 --- /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,659 @@ + + + + + + +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 ByondRevisionsURL = "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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 75 of file WindowsByondInstaller.cs.

+
76  {
77  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
78  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
79  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
80 
81  semaphore = new SemaphoreSlim(1);
82  installedDirectX = false;
83  }
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the WindowsByondInstaller
+
readonly ILogger< WindowsByondInstaller > logger
The ILogger for the WindowsByondInstaller
+ +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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 89 of file WindowsByondInstaller.cs.

+
90  {
91  try
92  {
93  await ioManager.DeleteDirectory(ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "byond/cache"), cancellationToken).ConfigureAwait(false);
94  }
95  catch(OperationCanceledException)
96  {
97  throw;
98  }
99  catch (Exception e)
100  {
101  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
102  }
103  }
+
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
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 106 of file WindowsByondInstaller.cs.

+
107  {
108  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURL, version.Major, version.Minor);
109 
110  return ioManager.DownloadFile(new Uri(url), cancellationToken);
111  }
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
const string ByondRevisionsURL
The URL format string for getting BYOND windows version {0}.{1} zipfile
+
readonly IIOManager ioManager
The IIOManager for the WindowsByondInstaller
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 114 of file WindowsByondInstaller.cs.

+ +

References Tgstation.Server.Host.Core.IProcessBase.Lifetime, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Core.IProcess.Terminate().

+
115  {
116  async Task SetNoPromptTrusted()
117  {
118  var configPath = ioManager.ConcatPath(path, ByondConfigDir);
119  await ioManager.CreateDirectory(configPath, cancellationToken).ConfigureAwait(false);
120  await ioManager.WriteAllBytes(ioManager.ConcatPath(configPath, ByondDDConfig), Encoding.UTF8.GetBytes(ByondNoPromptTrustedMode), cancellationToken).ConfigureAwait(false);
121  };
122 
123  var setNoPromptTrustedModeTask = SetNoPromptTrusted();
124 
125  //after this version lummox made DD depend of directx lol
126  //but then he became amazing and not only fixed it but also gave us 30s compiles \[T]/
127  if (version.Major == 512 && version.Minor >= 1427 && version.Minor < 1452 && !installedDirectX)
128  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
129  //check again because race conditions
130  if (!installedDirectX)
131  {
132  //always install it, it's pretty fast and will do better redundancy checking than us
133  var rbdx = ioManager.ConcatPath(path, ByondDXDir);
134  //noShellExecute because we aren't doing runas shennanigans
135  IProcess directXInstaller;
136  try
137  {
138  directXInstaller = processExecutor.LaunchProcess(ioManager.ConcatPath(rbdx, "DXSETUP.exe"), rbdx, "/silent", noShellExecute: true);
139  }
140  catch (Exception e)
141  {
142  throw new JobException("Unable to start DirectX installer process! Is the server running with admin privileges?", e);
143  }
144  using (directXInstaller)
145  {
146  int exitCode;
147  using (cancellationToken.Register(() => directXInstaller.Terminate()))
148  exitCode = await directXInstaller.Lifetime.ConfigureAwait(false);
149  cancellationToken.ThrowIfCancellationRequested();
150 
151  if (exitCode != 0)
152  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Failed to install included DirectX! Exit code: {0}", exitCode));
153  installedDirectX = true;
154  }
155  }
156 
157  await setNoPromptTrustedModeTask.ConfigureAwait(false);
158  }
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&#39;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
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondConfigDir = "byond/cfg"
+
+private
+
+ +

Directory to byond installation configuration

+ +

Definition at line 24 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondDDConfig = "daemon.txt"
+
+private
+
+ +

BYOND's DreamDaemon config file

+ +

Definition at line 28 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondDXDir = "byond/directx"
+
+private
+
+ +

The directory that contains the BYOND directx redistributable

+ +

Definition at line 36 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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 32 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondRevisionsURL = "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.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamDaemonName => "dreamdaemon.exe"
+
+ +

+ +

Definition at line 39 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamMakerName => "dm.exe"
+
+ +

+ +

Definition at line 42 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.installedDirectX
+
+private
+
+ +

If DirectX was installed

+ +

Definition at line 67 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ioManager
+
+private
+
+ +

The IIOManager for the WindowsByondInstaller

+ +

Definition at line 47 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<WindowsByondInstaller> Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger
+
+private
+
+ +

The ILogger for the WindowsByondInstaller

+ +

Definition at line 57 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.processExecutor
+
+private
+
+ +

The IProcessExecutor for the WindowsByondInstaller

+ +

Definition at line 52 of file WindowsByondInstaller.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.semaphore
+
+private
+
+ +

The SemaphoreSlim for the WindowsByondInstaller

+ +

Definition at line 62 of file WindowsByondInstaller.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_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..2d5e378ed5 --- /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,116 @@ + + + + + + +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..70191ffbb6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html @@ -0,0 +1,324 @@ + + + + + + +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 IsAdmin [get, set]
 If this is considered a channel for admin commands More...
 
bool IsPrivate [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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Channel.FriendlyName
+
+getset
+
+ +

The user friendly name of the Channel

+ +

Definition at line 31 of file Channel.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Channel.Id
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Channel.IsAdmin
+
+getset
+
+ +

If this is considered a channel for admin commands

+ +

Definition at line 41 of file Channel.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Channel.IsPrivate
+
+getset
+
+ +

If this is a 1-to-1 chat channel

+ +

Definition at line 46 of file Channel.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Channel.Tag
+
+getset
+
+
+
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..e2070c8a81 --- /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,114 @@ + + + + + + +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..2744c247d1 --- /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,261 @@ + + + + + + +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 Tgstation.Server.Host.Components.Chat.ChannelMapping.Channel
+
+getset
+
+ +

The Components.Chat.Channel with the mapped Id

+ +

Definition at line 31 of file ChannelMapping.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.ChannelMapping.IsUpdatesChannel
+
+getset
+
+ +

If the Channel is an updates channel

+ +

Definition at line 26 of file ChannelMapping.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.ChannelMapping.IsWatchdogChannel
+
+getset
+
+ +

If Channel is a watchdog channel

+ +

Definition at line 21 of file ChannelMapping.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeChannels().

+ +
+
+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.ChannelMapping.ProviderChannelId
+
+getset
+
+ +

The original Components.Chat.Channel.RealId

+ +

Definition at line 16 of file ChannelMapping.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Components.Chat.ChannelMapping.ProviderId
+
+getset
+
+ +

The Id of the Providers.IProvider

+ +

Definition at line 11 of file ChannelMapping.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_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..6648c7444b --- /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,145 @@ + + + + + + +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..8152420e09 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html @@ -0,0 +1,1415 @@ + + + + + + +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 18 of file Chat.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 123 of file Chat.cs.

+ +

References Tgstation.Server.Host.Core.IServerControl.RegisterForRestart().

+
124  {
125  this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
126  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
127  this.commandFactory = commandFactory ?? throw new ArgumentNullException(nameof(commandFactory));
128  if (serverControl == null)
129  throw new ArgumentNullException(nameof(serverControl));
130  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
131  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
132  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
133  this.initialChatBots = initialChatBots?.ToList() ?? throw new ArgumentNullException(nameof(initialChatBots));
134 
135  restartRegistration = serverControl.RegisterForRestart(this);
136 
137  builtinCommands = new Dictionary<string, ICommand>();
138  providers = new Dictionary<long, IProvider>();
139  mappedChannels = new Dictionary<ulong, ChannelMapping>();
140  trackingContexts = new List<IJsonTrackingContext>();
141  handlerCts = new CancellationTokenSource();
142  connectionsUpdated = new TaskCompletionSource<object>();
143  channelIdCounter = 1;
144  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the Chat
Definition: Chat.cs:50
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
readonly List< Models.ChatBot > initialChatBots
The initial Models.ChatBot for the Chat
Definition: Chat.cs:85
+
readonly IProviderFactory providerFactory
The IProviderFactory for the Chat
Definition: Chat.cs:25
+
TaskCompletionSource< object > connectionsUpdated
The TaskCompletionSource<TResult> that completes when ChatBots change
Definition: Chat.cs:100
+
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:55
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:105
+
readonly Dictionary< string, ICommand > builtinCommands
Unchanging ICommands in the Chat mapped by ICommand.Name
Definition: Chat.cs:60
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:75
+
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:40
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:80
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 380 of file Chat.cs.

+ +

References Tgstation.Server.Host.Components.Chat.ChannelMapping.IsWatchdogChannel.

+
381  {
382  if (newChannels == null)
383  throw new ArgumentNullException(nameof(newChannels));
384  var provider = await RemoveProvider(connectionId, false, cancellationToken).ConfigureAwait(false);
385  if (provider == null)
386  return;
387  var results = await provider.MapChannels(newChannels, cancellationToken).ConfigureAwait(false);
388  if (results == null) //aborted
389  return;
390  var mappings = Enumerable.Zip(newChannels, results, (x, y) => new ChannelMapping
391  {
392  IsWatchdogChannel = x.IsWatchdogChannel == true,
393  IsUpdatesChannel = x.IsUpdatesChannel == true,
394  ProviderChannelId = y.RealId,
395  ProviderId = connectionId,
396  Channel = y
397  });
398 
399  ulong baseId;
400  lock (this)
401  {
402  baseId = channelIdCounter;
403  channelIdCounter += (ulong)results.Count;
404  }
405 
406  Task task;
407  lock (mappedChannels)
408  {
409  lock (providers)
410  if (!providers.TryGetValue(connectionId, out IProvider verify) || verify != provider) //aborted again
411  return;
412  foreach (var I in mappings)
413  {
414  var newId = baseId++;
415  mappedChannels.Add(newId, I);
416  I.Channel.RealId = newId;
417  }
418 
419  lock (trackingContexts)
420  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
421  }
422  await task.ConfigureAwait(false);
423  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
For interacting with a chat service
Definition: IProvider.cs:11
+
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:162
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:105
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:75
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 426 of file Chat.cs.

+ +

References Tgstation.Server.Host.Components.Chat.Providers.IProvider.Disconnect(), Tgstation.Server.Api.Models.Internal.ChatBot.Enabled, and Tgstation.Server.Api.Models.Internal.ChatBot.Id.

+
427  {
428  if (newSettings == null)
429  throw new ArgumentNullException(nameof(newSettings));
430  IProvider provider;
431 
432  async Task DisconnectProvider(IProvider p)
433  {
434  try
435  {
436  await p.Disconnect(cancellationToken).ConfigureAwait(false);
437  }
438  finally
439  {
440  p.Dispose();
441  }
442  }
443 
444  Task disconnectTask;
445  lock (providers)
446  {
447  //raw settings changes forces a rebuild of the provider
448  if (providers.TryGetValue(newSettings.Id, out provider))
449  {
450  providers.Remove(newSettings.Id);
451  disconnectTask = DisconnectProvider(provider);
452  }
453  else
454  disconnectTask = Task.CompletedTask;
455  if (newSettings.Enabled.Value)
456  {
457  provider = providerFactory.CreateProvider(newSettings);
458  providers.Add(newSettings.Id, provider);
459  }
460  }
461 
462  lock (mappedChannels)
463  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == newSettings.Id).Select(x => x.Key).ToList())
464  mappedChannels.Remove(I);
465 
466  await disconnectTask.ConfigureAwait(false);
467 
468  if (started)
469  {
470  if (newSettings.Enabled.Value)
471  await provider.Connect(cancellationToken).ConfigureAwait(false);
472  lock (this)
473  {
474  //same thread shennanigans
475  var oldOne = connectionsUpdated;
476  connectionsUpdated = new TaskCompletionSource<object>();
477  oldOne.SetResult(null);
478  }
479  }
480  }
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:110
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
For interacting with a chat service
Definition: IProvider.cs:11
+
IProvider CreateProvider(ChatBot settings)
Create a IProvider
+
readonly IProviderFactory providerFactory
The IProviderFactory for the Chat
Definition: Chat.cs:25
+
TaskCompletionSource< object > connectionsUpdated
The TaskCompletionSource<TResult> that completes when ChatBots change
Definition: Chat.cs:100
+ +
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
bool Enabled
If the connection is enabled
Definition: ChatBot.cs:26
+
+
+
+ +
+
+ + + + + + + + +
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 567 of file Chat.cs.

+
568  {
569  lock (providers)
570  return providers.TryGetValue(connectionId, out var provider) && provider.Connected;
571  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
bool Connected(long connectionId)
If a given set of ChatBot is connected
Definition: Chat.cs:567
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 582 of file Chat.cs.

+
583  {
584  var provider = await RemoveProvider(connectionId, true, cancellationToken).ConfigureAwait(false);
585  if (provider != null)
586  try
587  {
588  await provider.Disconnect(cancellationToken).ConfigureAwait(false);
589  }
590  finally
591  {
592  provider.Dispose();
593  }
594  }
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:162
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Chat.Chat.Dispose ()
+
+ +

+ +

Definition at line 147 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.Dispose().

+
148  {
149  restartRegistration.Dispose();
150  handlerCts.Dispose();
151  foreach (var I in providers)
152  I.Value.Dispose();
153  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Chat
Definition: Chat.cs:40
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:80
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 597 of file Chat.cs.

+
598  {
599  var message = updateVersion == null ? "TGS: Restart requested..." : String.Format(CultureInfo.InvariantCulture, "TGS: Updating to version {0}...", updateVersion);
600  List<ulong> wdChannels;
601  lock (mappedChannels) //so it doesn't change while we're using it
602  wdChannels = mappedChannels.Select(x => x.Key).ToList();
603  return SendMessage(message, wdChannels, cancellationToken);
604  }
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:483
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 332 of file Chat.cs.

+
333  {
334  var messageTasks = new Dictionary<IProvider, Task<Message>>();
335  try
336  {
337  while (!cancellationToken.IsCancellationRequested)
338  {
339  //prune disconnected providers
340  foreach (var I in messageTasks.Where(x => !x.Key.Connected).ToList())
341  messageTasks.Remove(I.Key);
342 
343  //add new ones
344  Task updatedTask;
345  lock (this)
346  updatedTask = connectionsUpdated.Task;
347  lock (providers)
348  foreach (var I in providers)
349  if (I.Value.Connected && !messageTasks.ContainsKey(I.Value))
350  messageTasks.Add(I.Value, I.Value.NextMessage(cancellationToken));
351 
352  if (messageTasks.Count == 0)
353  {
354  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
355  continue;
356  }
357 
358  //wait for a message
359  await Task.WhenAny(updatedTask, Task.WhenAny(messageTasks.Select(x => x.Value))).ConfigureAwait(false);
360 
361  //process completed ones
362  foreach (var I in messageTasks.Where(x => x.Value.IsCompleted).ToList())
363  {
364  var message = await I.Value.ConfigureAwait(false);
365 
366  await ProcessMessage(I.Key, message, cancellationToken).ConfigureAwait(false);
367 
368  messageTasks.Remove(I.Key);
369  }
370  }
371  }
372  catch (OperationCanceledException) { }
373  catch (Exception e)
374  {
375  logger.LogError("Message monitor crashed!: Exception: {0}", e);
376  }
377  }
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
bool Connected(long connectionId)
If a given set of ChatBot is connected
Definition: Chat.cs:567
+
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:100
+
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:55
+
async Task ProcessMessage(IProvider provider, Message message, CancellationToken cancellationToken)
Processes a message
Definition: Chat.cs:191
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Chat
Definition: Chat.cs:45
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 191 of file Chat.cs.

+ +

References Tgstation.Server.Host.Components.Chat.Providers.IProvider.BotMention, Tgstation.Server.Host.Components.Chat.User.Channel, 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.IsAdmin, Tgstation.Server.Host.Components.Chat.Channel.IsPrivate, Tgstation.Server.Host.Components.Chat.Channel.RealId, Tgstation.Server.Host.Components.Chat.Channel.Tag, and Tgstation.Server.Host.Components.Chat.Providers.Message.User.

+
192  {
193  //map the channel if it's private and we haven't seen it
194  lock (providers)
195  {
196  var providerId = providers.Where(x => x.Value == provider).Select(x => x.Key).First();
197  var enumerable = mappedChannels.Where(x => x.Value.ProviderId == providerId && x.Value.ProviderChannelId == message.User.Channel.RealId);
198  if (message.User.Channel.IsPrivate)
199  lock (mappedChannels)
200  {
201  if (!provider.Connected)
202  return;
203  if (!enumerable.Any())
204  {
205  ulong newId;
206  lock (this)
207  newId = channelIdCounter++;
208  mappedChannels.Add(newId, new ChannelMapping
209  {
210  IsWatchdogChannel = false,
211  ProviderChannelId = message.User.Channel.RealId,
212  ProviderId = providerId,
213  Channel = message.User.Channel
214  });
215  message.User.Channel.RealId = newId;
216  }
217  else
218  message.User.Channel.RealId = enumerable.First().Key;
219  }
220  else
221  {
222  //need to add tag and isAdminChannel
223  var mapping = enumerable.First().Value;
224  message.User.Channel.Id = mapping.Channel.Id;
225  message.User.Channel.Tag = mapping.Channel.Tag;
226  message.User.Channel.IsAdmin = mapping.Channel.IsAdmin;
227  }
228  }
229 
230  var splits = new List<string>(message.Content.Trim().Split(' '));
231  var address = splits[0];
232  if (address.Length > 1 && (address[address.Length - 1] == ':' || address[address.Length - 1] == ','))
233  address = address.Substring(0, address.Length - 1);
234 
235  address = address.ToUpperInvariant();
236 
237  var addressed = address == CommonMention.ToUpperInvariant() || address == provider.BotMention.ToUpperInvariant();
238 
239  if (!addressed && !message.User.Channel.IsPrivate)
240  //no mention
241  return;
242 
243  logger.LogTrace("Chat command: {0}. User (True provider Id): {1}", message.Content, JsonConvert.SerializeObject(message.User));
244 
245  if (addressed)
246  splits.RemoveAt(0);
247 
248  if (splits.Count == 0)
249  {
250  //just a mention
251  await SendMessage("Hi!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
252  return;
253  }
254 
255  var command = splits[0].ToUpperInvariant();
256  splits.RemoveAt(0);
257  var arguments = String.Join(" ", splits);
258 
259  try
260  {
261  async Task<ICommand> GetCommand(string commandName)
262  {
263  if (!builtinCommands.TryGetValue(commandName, out var handler))
264  {
265  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken));
266  await Task.WhenAll(tasks).ConfigureAwait(false);
267  handler = tasks.SelectMany(x => x.Result).Where(x => x.Name.ToUpperInvariant() == commandName).FirstOrDefault();
268  }
269  return handler;
270  };
271 
272  const string UnknownCommandMessage = "Unknown command! Type '?' or 'help' for available commands.";
273 
274  if (command == "HELP" || command == "?")
275  {
276  string helpText;
277  if (splits.Count == 0)
278  {
279  var allCommands = builtinCommands.Select(x => x.Value).ToList();
280  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken)).ToList();
281  await Task.WhenAll(tasks).ConfigureAwait(false);
282  allCommands.AddRange(tasks.SelectMany(x => x.Result));
283  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)));
284  }
285  else
286  {
287  var helpHandler = await GetCommand(splits[0].ToUpperInvariant()).ConfigureAwait(false);
288  if (helpHandler != default)
289  helpText = String.Format(CultureInfo.InvariantCulture, "{0}: {1}{2}", helpHandler.Name, helpHandler.HelpText, helpHandler.AdminOnly ? " - May only be used in admin channels" : String.Empty);
290  else
291  helpText = UnknownCommandMessage;
292  }
293  await SendMessage(helpText, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
294  return;
295  }
296 
297  var commandHandler = await GetCommand(command).ConfigureAwait(false);
298 
299  if (commandHandler == default)
300  {
301  await SendMessage(UnknownCommandMessage, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
302  return;
303  }
304 
305  if (commandHandler.AdminOnly && !message.User.Channel.IsAdmin)
306  {
307  await SendMessage("Use this command in an admin channel!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
308  return;
309  }
310 
311  var result = await commandHandler.Invoke(arguments, message.User, cancellationToken).ConfigureAwait(false);
312  if (result != null)
313  await SendMessage(result, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
314  }
315  catch (OperationCanceledException)
316  {
317  throw;
318  }
319  catch (Exception e)
320  {
321  //error bc custom commands should reply about why it failed
322  logger.LogError("Error processing chat command: {0}", e);
323  await SendMessage("Internal error processing command!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
324  }
325  }
+
User User
The Components.Chat.User who sent the Message
Definition: Message.cs:16
+
bool IsPrivate
If this is a 1-to-1 chat channel
Definition: Channel.cs:46
+ + +
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:65
+ +
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:55
+
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: Channel.cs:15
+
bool IsAdmin
If this is considered a channel for admin commands
Definition: Channel.cs:41
+ +
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
string BotMention
The string that indicates the IProvider was mentioned
Definition: IProvider.cs:21
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:105
+
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:60
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:483
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:75
+
+
+
+ +
+
+ + + + + + + + +
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 574 of file Chat.cs.

+
575  {
576  if (this.customCommandHandler != null)
577  throw new InvalidOperationException("RegisterCommandHandler() already called!");
578  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
579  }
ICustomCommandHandler customCommandHandler
The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>, CancellationToken)
Definition: Chat.cs:90
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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, otherwise
+ +

Definition at line 162 of file Chat.cs.

+
163  {
164  IProvider provider;
165  lock (providers)
166  if (!providers.TryGetValue(connectionId, out provider))
167  return null;
168  Task task;
169  lock (mappedChannels)
170  {
171  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == connectionId).Select(x => x.Key).ToList())
172  mappedChannels.Remove(I);
173 
174  if (updateTrackings)
175  lock (trackingContexts)
176  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
177  else
178  task = Task.CompletedTask;
179  }
180  await task.ConfigureAwait(false);
181  return provider;
182  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
For interacting with a chat service
Definition: IProvider.cs:11
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:75
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 483 of file Chat.cs.

+
484  {
485  if (message == null)
486  throw new ArgumentNullException(nameof(message));
487  if (channelIds == null)
488  throw new ArgumentNullException(nameof(channelIds));
489 
490  return Task.WhenAll(channelIds.Select(x =>
491  {
492  ChannelMapping channelMapping;
493  lock (mappedChannels)
494  if (!mappedChannels.TryGetValue(x, out channelMapping))
495  return Task.CompletedTask;
496  IProvider provider;
497  lock (providers)
498  if (!providers.TryGetValue(channelMapping.ProviderId, out provider))
499  return Task.CompletedTask;
500  return provider.SendMessage(channelMapping.ProviderChannelId, message, cancellationToken);
501  }));
502  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 515 of file Chat.cs.

+
516  {
517  List<ulong> wdChannels;
518  message = String.Format(CultureInfo.InvariantCulture, "DM: {0}", message);
519  lock (mappedChannels) //so it doesn't change while we're using it
520  wdChannels = mappedChannels.Where(x => x.Value.IsUpdatesChannel).Select(x => x.Key).ToList();
521  return SendMessage(message, wdChannels, cancellationToken);
522  }
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:483
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 505 of file Chat.cs.

+
506  {
507  List<ulong> wdChannels;
508  message = String.Format(CultureInfo.InvariantCulture, "WD: {0}", message);
509  lock (mappedChannels) //so it doesn't change while we're using it
510  wdChannels = mappedChannels.Where(x => x.Value.IsWatchdogChannel).Select(x => x.Key).ToList();
511  return SendMessage(message, wdChannels, cancellationToken);
512  }
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:483
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 525 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+
526  {
527  foreach (var I in commandFactory.GenerateCommands())
528  builtinCommands.Add(I.Name.ToUpperInvariant(), I);
529  await Task.WhenAll(initialChatBots.Select(x => ChangeSettings(x, cancellationToken))).ConfigureAwait(false);
530  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Connect(cancellationToken))).ConfigureAwait(false);
531  await Task.WhenAll(initialChatBots.Select(x => ChangeChannels(x.Id, x.Channels, cancellationToken))).ConfigureAwait(false);
533  started = true;
534  }
bool started
If StartAsync(CancellationToken) has been called
Definition: Chat.cs:110
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
readonly List< Models.ChatBot > initialChatBots
The initial Models.ChatBot for the Chat
Definition: Chat.cs:85
+
IReadOnlyList< ICommand > GenerateCommands()
Generate builtin ICommands
+
readonly ICommandFactory commandFactory
The ICommandFactory for the Chat
Definition: Chat.cs:35
+
async Task MonitorMessages(CancellationToken cancellationToken)
Monitors active providers for new Messages
Definition: Chat.cs:332
+
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:426
+
Task chatHandler
The Task that monitors incoming chat messages
Definition: Chat.cs:95
+
readonly Dictionary< string, ICommand > builtinCommands
Unchanging ICommands in the Chat mapped by ICommand.Name
Definition: Chat.cs:60
+
async Task ChangeChannels(long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)
Change chat channels
Definition: Chat.cs:380
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:80
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 537 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+
538  {
539  handlerCts.Cancel();
540  await chatHandler.ConfigureAwait(false);
541  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Disconnect(cancellationToken))).ConfigureAwait(false);
542  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:65
+
Task chatHandler
The Task that monitors incoming chat messages
Definition: Chat.cs:95
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:80
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 545 of file Chat.cs.

+ +

References Tgstation.Server.Host.Components.Chat.JsonTrackingContext.SetChannels().

+
546  {
547  if (customCommandHandler == null)
548  throw new InvalidOperationException("RegisterCommandHandler() hasn't been called!");
549  JsonTrackingContext context = null;
550  context = new JsonTrackingContext(ioManager, customCommandHandler, loggerFactory.CreateLogger<JsonTrackingContext>(), () =>
551  {
552  lock (trackingContexts)
553  trackingContexts.Remove(context);
554  }, ioManager.ConcatPath(basePath, commandsJsonName), ioManager.ConcatPath(basePath, channelsJsonName));
555  Task task;
556  lock (trackingContexts)
557  {
558  trackingContexts.Add(context);
559  lock (mappedChannels)
560  task = context.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken);
561  }
562  await task.ConfigureAwait(false);
563  return context;
564  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the Chat
Definition: Chat.cs:50
+
readonly IIOManager ioManager
The IIOManager for the Chat
Definition: Chat.cs:30
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:70
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:75
+
ICustomCommandHandler customCommandHandler
The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>, CancellationToken)
Definition: Chat.cs:90
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.Chat.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the Chat

+ +

Definition at line 45 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<string, ICommand> Tgstation.Server.Host.Components.Chat.Chat.builtinCommands
+
+private
+
+ +

Unchanging ICommands in the Chat mapped by ICommand.Name

+ +

Definition at line 60 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.Chat.channelIdCounter
+
+private
+
+ +

Used for remapping Channel.RealIds

+ +

Definition at line 105 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Chat.Chat.chatHandler
+
+private
+
+ +

The Task that monitors incoming chat messages

+ +

Definition at line 95 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICommandFactory Tgstation.Server.Host.Components.Chat.Chat.commandFactory
+
+private
+
+ +

The ICommandFactory for the Chat

+ +

Definition at line 35 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Chat.Chat.CommonMention = "!tgs"
+
+private
+
+ +

Definition at line 20 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Chat.Chat.connectionsUpdated
+
+private
+
+ +

The TaskCompletionSource<TResult> that completes when ChatBots change

+ +

Definition at line 100 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ICustomCommandHandler Tgstation.Server.Host.Components.Chat.Chat.customCommandHandler
+
+private
+
+ +

The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>, CancellationToken)

+ +

Definition at line 90 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Chat.Chat.handlerCts
+
+private
+
+ +

The CancellationTokenSource for chatHandler

+ +

Definition at line 80 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly List<Models.ChatBot> Tgstation.Server.Host.Components.Chat.Chat.initialChatBots
+
+private
+
+ +

The initial Models.ChatBot for the Chat

+ +

Definition at line 85 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Chat.Chat.ioManager
+
+private
+
+ +

The IIOManager for the Chat

+ +

Definition at line 30 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Chat> Tgstation.Server.Host.Components.Chat.Chat.logger
+
+private
+
+ +

The ILogger for the Chat

+ +

Definition at line 55 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Chat.Chat.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the Chat

+ +

Definition at line 50 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<ulong, ChannelMapping> Tgstation.Server.Host.Components.Chat.Chat.mappedChannels
+
+private
+
+ +

Map of Channel.RealIds to ChannelMappings

+ +

Definition at line 70 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProviderFactory Tgstation.Server.Host.Components.Chat.Chat.providerFactory
+
+private
+
+ +

The IProviderFactory for the Chat

+ +

Definition at line 25 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<long, IProvider> Tgstation.Server.Host.Components.Chat.Chat.providers
+
+private
+
+ +

Map of IProviders in use, keyed by ChatBot.Id

+ +

Definition at line 65 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IRestartRegistration Tgstation.Server.Host.Components.Chat.Chat.restartRegistration
+
+private
+
+ +

The IRestartRegistration for the Chat

+ +

Definition at line 40 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Chat.started
+
+private
+
+ +

If StartAsync(CancellationToken) has been called

+ +

Definition at line 110 of file Chat.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly List<IJsonTrackingContext> Tgstation.Server.Host.Components.Chat.Chat.trackingContexts
+
+private
+
+ +

The active IJsonTrackingContexts for the Chat

+ +

Definition at line 75 of file Chat.cs.

+ +
+
+
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..7ca7adbce8 --- /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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 ILoggerFactory loggerFactory
The ILoggerFactory for the ChatFactory
Definition: ChatFactory.cs:16
+
readonly IProviderFactory providerFactory
The IProviderFactory for the ChatFactory
Definition: ChatFactory.cs:21
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
IChat Tgstation.Server.Host.Components.Chat.ChatFactory.CreateChat (IIOManager ioManager,
ICommandFactory commandFactory,
IEnumerable< Models.ChatBotinitialChatBots 
)
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.ChatFactory.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the ChatFactory

+ +

Definition at line 31 of file ChatFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Chat.ChatFactory.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the ChatFactory

+ +

Definition at line 16 of file ChatFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProviderFactory Tgstation.Server.Host.Components.Chat.ChatFactory.providerFactory
+
+private
+
+ +

The IProviderFactory for the ChatFactory

+ +

Definition at line 21 of file ChatFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IServerControl Tgstation.Server.Host.Components.Chat.ChatFactory.serverControl
+
+private
+
+ +

The IServerControl for the ChatFactory

+ +

Definition at line 26 of file ChatFactory.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_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..f81bf464ab --- /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,112 @@ + + + + + + +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..3a12f32a1d --- /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,231 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
override bool Tgstation.Server.Host.Components.Chat.Commands.BoolConverter.CanConvert (Type objectType)
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
override object Tgstation.Server.Host.Components.Chat.Commands.BoolConverter.ReadJson (JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer 
)
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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..f54317aa2a --- /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,116 @@ + + + + + + +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..8dbdae2899 --- /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.IsAdmin set More...
 
+

Detailed Description

+

For displaying the installed Byond version

+ +

Definition at line 14 of file ByondCommand.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.AdminOnly => false
+
+ +

+ +

Definition at line 23 of file ByondCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.byondManager
+
+private
+
+ +

The IByondManager for the ByondCommand

+ +

Definition at line 28 of file ByondCommand.cs.

+ +
+
+ +
+
+ + + + +
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.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Name => "byond"
+
+ +

+ +

Definition at line 17 of file ByondCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog
+
+private
+
+ +

The IWatchdog for the ByondCommand

+ +

Definition at line 33 of file ByondCommand.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_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..4ab5b54a01 --- /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,118 @@ + + + + + + +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..18fc9df868 --- /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,421 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 Models.Instance instance
The Models.Instance for the CommandFactory
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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  }
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.application
+
+private
+
+ +

The IApplication for the CommandFactory

+ +

Definition at line 16 of file CommandFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.byondManager
+
+private
+
+ +

The IByondManager for the CommandFactory

+ +

Definition at line 21 of file CommandFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the CommandFactory

+ +

Definition at line 31 of file CommandFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Models.Instance Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.instance
+
+private
+
+ +

The Models.Instance for the CommandFactory

+ +

Definition at line 36 of file CommandFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IRepositoryManager Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.repositoryManager
+
+private
+
+ +

The IRepositoryManager for the CommandFactory

+ +

Definition at line 26 of file CommandFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IWatchdog Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog
+
+private
+
+ +

The IWatchdog for the CommandFactory

+ +

Definition at line 41 of file CommandFactory.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_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..fa1d6fcb67 --- /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,115 @@ + + + + + + +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..5ecc3f86eb --- /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,334 @@ + + + + + + +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.IsAdmin 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Components.Chat.ICustomCommandHandler.HandleChatCommand().

+
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
+
+
+
+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
ICustomCommandHandler Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.handler
+
+private
+
+ +

The ICustomCommandHandler for the CustomCommand

+ +

Definition at line 26 of file CustomCommand.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.AdminOnly
+
+getset
+
+ +

+ +

Definition at line 21 of file CustomCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.HelpText
+
+getset
+
+ +

+ +

Definition at line 17 of file CustomCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Name
+
+getset
+
+ +

+ +

Definition at line 14 of file CustomCommand.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_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..31fe8ef25a --- /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,114 @@ + + + + + + +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..a9bf09dd5a --- /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,275 @@ + + + + + + +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.IsAdmin set More...
 
+

Detailed Description

+

kek

+ +

Definition at line 9 of file KekCommand.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+
+

Member Data Documentation

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.KekCommand.AdminOnly => false
+
+ +

+ +

Definition at line 23 of file KekCommand.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.KekCommand.HelpText => Kek
+
+ +

+ +

Definition at line 20 of file KekCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Kek = "kek"
+
+private
+
+ +

kek

+ +

Definition at line 14 of file KekCommand.cs.

+ +
+
+ +
+
+ + + + +
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..e0fc176afe --- /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,118 @@ + + + + + + +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..b88a263f8d --- /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,423 @@ + + + + + + +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.IsAdmin set More...
 
+

Detailed Description

+

Command for reading the active Api.Models.TestMerges

+ +

Definition at line 17 of file PullRequestsCommand.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 64 of file PullRequestsCommand.cs.

+
65  {
66  IEnumerable<Models.TestMerge> results = null;
67  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
68  {
69  string head;
70  using (var repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
71  {
72  if (repo == null)
73  return "Repository unavailable!";
74  head = repo.Head;
75  }
76  await databaseContextFactory.UseContext(async db => results = await db.RevisionInformations.Where(x => x.Instance.Id == instance.Id && x.CommitSha == head)
77  .SelectMany(x => x.ActiveTestMerges)
78  .Select(x => x.TestMerge)
79  .Select(x => new Models.TestMerge
80  {
81  Number = x.Number,
82  PullRequestRevision = x.PullRequestRevision
83  }).ToListAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
84  }
85  else
86  {
87  if (!watchdog.Running)
88  return "Server offline!";
89  results = watchdog.ActiveCompileJob?.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).ToList() ?? new List<Models.TestMerge>();
90  }
91 
92  if (!results.Any())
93  return "None!";
94 
95  return 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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.AdminOnly => false
+
+ +

+ +

Definition at line 26 of file PullRequestsCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the PullRequestsCommand

+ +

Definition at line 41 of file PullRequestsCommand.cs.

+ +
+
+ +
+
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Models.Instance Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.instance
+
+private
+
+ +

The Models.Instance for the PullRequestsCommand

+ +

Definition at line 46 of file PullRequestsCommand.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Name => "prs"
+
+ +

+ +

Definition at line 20 of file PullRequestsCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IRepositoryManager Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.repositoryManager
+
+private
+
+ +

The IRepositoryManager for the PullRequestsCommand

+ +

Definition at line 36 of file PullRequestsCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog
+
+private
+
+ +

The IWatchdog for the PullRequestsCommand

+ +

Definition at line 31 of file PullRequestsCommand.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_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..41f3bf3442 --- /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,117 @@ + + + + + + +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..5d59ef5bcd --- /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,385 @@ + + + + + + +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.IsAdmin set More...
 
+

Detailed Description

+

For displaying Api.Models.Internal.RevisionInformation

+ +

Definition at line 15 of file RevisionCommand.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.AdminOnly => false
+
+ +

+ +

Definition at line 24 of file RevisionCommand.cs.

+ +
+
+ +
+
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Models.Instance Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.instance
+
+private
+
+ +

The Models.Instance for the PullRequestsCommand

+ +

Definition at line 39 of file RevisionCommand.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Name => "revision"
+
+ +

+ +

Definition at line 18 of file RevisionCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IRepositoryManager Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.repositoryManager
+
+private
+
+ +

The IRepositoryManager for the PullRequestsCommand

+ +

Definition at line 34 of file RevisionCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog
+
+private
+
+ +

The IWatchdog for the PullRequestsCommand

+ +

Definition at line 29 of file RevisionCommand.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_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..197699a39d --- /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,115 @@ + + + + + + +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..92ed575e19 --- /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,305 @@ + + + + + + +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.IsAdmin set More...
 
+

Detailed Description

+

ICommand to return the IApplication.VersionString

+ +

Definition at line 11 of file VersionCommand.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.VersionCommand (IApplication application)
+
+ +

Construct a VersionCommand

+
Parameters
+ + +
application
+
+
+ +

Definition at line 31 of file VersionCommand.cs.

+
32  {
33  this.application = application ?? throw new ArgumentNullException(nameof(application));
34  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+
+

Member Data Documentation

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.AdminOnly => false
+
+ +

+ +

Definition at line 20 of file VersionCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.application
+
+private
+
+ +

The IApplication for the VersionCommand

+ +

Definition at line 25 of file VersionCommand.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.HelpText => "Displays the tgstation server version"
+
+ +

+ +

Definition at line 17 of file VersionCommand.cs.

+ +
+
+ +
+
+ + + + +
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..eb927734dd --- /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,122 @@ + + + + + + +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..c2791f18ac --- /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,529 @@ + + + + + + +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)
 
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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.JsonTrackingContext.JsonTrackingContext (IIOManager ioManager,
ICustomCommandHandler customCommandHandler,
ILogger< JsonTrackingContextlogger,
Action onDispose,
string commandsPath,
string channelsPath 
)
+
+ +

Definition at line 41 of file JsonTrackingContext.cs.

+
42  {
43  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
44  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
45  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
46  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
47  this.commandsPath = commandsPath ?? throw new ArgumentNullException(nameof(commandsPath));
48  this.channelsPath = channelsPath ?? throw new ArgumentNullException(nameof(channelsPath));
49 
50  channelsSemaphore = new SemaphoreSlim(1);
51  active = false;
52 
53  logger.LogTrace("Created tracking context for {0} and {1}", commandsPath, channelsPath);
54  }
+ + + + + + +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Dispose ()
+
+ +

+ +

Definition at line 57 of file JsonTrackingContext.cs.

+
58  {
59  logger.LogTrace("Disposing...");
60  onDispose();
61  }
+ +
+
+
+ +
+
+ + + + + + + + +
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 64 of file JsonTrackingContext.cs.

+
65  {
66  try
67  {
68  if (Active && await ioManager.FileExists(commandsPath, cancellationToken).ConfigureAwait(false))
69  {
70  var resultBytes = await ioManager.ReadAllBytes(commandsPath, cancellationToken).ConfigureAwait(false);
71  var resultJson = Encoding.UTF8.GetString(resultBytes);
72  logger.LogTrace("Read commands JSON: {0}", resultJson);
73  var result = JsonConvert.DeserializeObject<List<CustomCommand>>(resultJson, new JsonSerializerSettings
74  {
75  ContractResolver = new DefaultContractResolver
76  {
77  NamingStrategy = new SnakeCaseNamingStrategy()
78  }
79  });
80  foreach (var I in result)
81  I.SetHandler(customCommandHandler);
82  return result;
83  }
84  }
85  catch (OperationCanceledException)
86  {
87  throw;
88  }
89  catch (Exception e)
90  {
91  logger.LogWarning("Error retrieving custom commands! Exception: {0}", e);
92  }
93  return new List<CustomCommand>();
94  }
+ +
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
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 97 of file JsonTrackingContext.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.TrackJsons().

+
98  {
99  using (await SemaphoreSlimContext.Lock(channelsSemaphore, cancellationToken).ConfigureAwait(false))
100  {
101  var json = JsonConvert.SerializeObject(channels, new JsonSerializerSettings
102  {
103  ContractResolver = new CamelCasePropertyNamesContractResolver()
104  });
105  logger.LogTrace("Writing channels JSON: {0}", json);
106  await ioManager.WriteAllBytes(channelsPath, Encoding.UTF8.GetBytes(json), cancellationToken).ConfigureAwait(false);
107  }
108  }
+
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
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.JsonTrackingContext.active
+
+private
+
+ +

Definition at line 39 of file JsonTrackingContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsPath
+
+private
+
+ +

Definition at line 35 of file JsonTrackingContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsSemaphore
+
+private
+
+ +

Definition at line 37 of file JsonTrackingContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.JsonTrackingContext.commandsPath
+
+private
+
+ +

Definition at line 34 of file JsonTrackingContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICustomCommandHandler Tgstation.Server.Host.Components.Chat.JsonTrackingContext.customCommandHandler
+
+private
+
+ +

Definition at line 30 of file JsonTrackingContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Chat.JsonTrackingContext.ioManager
+
+private
+
+ +

Definition at line 29 of file JsonTrackingContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<JsonTrackingContext> Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger
+
+private
+
+ +

Definition at line 31 of file JsonTrackingContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Action Tgstation.Server.Host.Components.Chat.JsonTrackingContext.onDispose
+
+private
+
+ +

Definition at line 32 of file JsonTrackingContext.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Active
+
+getset
+
+ +

+ +

Definition at line 20 of file JsonTrackingContext.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_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..70c854e9f2 --- /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,115 @@ + + + + + + +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..335522aef0 --- /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,301 @@ + + + + + + +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 12 of file ProviderFactory.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 35 of file ProviderFactory.cs.

+
36  {
37  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
38  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
39  this.application = application ?? throw new ArgumentNullException(nameof(application));
40  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProviderFactory
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
IProvider Tgstation.Server.Host.Components.Chat.ProviderFactory.CreateProvider (Api.Models.Internal.ChatBot settings)
+
+ +

+ +

Definition at line 43 of file ProviderFactory.cs.

+
44  {
45  if (settings == null)
46  throw new ArgumentNullException(nameof(settings));
47  var builder = settings.ConnectionStringBuilder;
48  if (builder == null || !builder.Valid)
49  throw new InvalidOperationException("Invalid ChatConnectionStringBuilder!");
50  switch (settings.Provider)
51  {
52  case ChatProvider.Irc:
53  var ircBuilder = (IrcConnectionStringBuilder)builder;
54  return new IrcProvider(application, asyncDelayer, loggerFactory.CreateLogger<IrcProvider>(), ircBuilder.Address, ircBuilder.Port.Value, ircBuilder.Nickname, ircBuilder.Password, ircBuilder.PasswordType, ircBuilder.UseSsl.Value);
55  case ChatProvider.Discord:
56  var discordBuilder = (DiscordConnectionStringBuilder)builder;
57  return new DiscordProvider(loggerFactory.CreateLogger<DiscordProvider>(), discordBuilder.BotToken);
58  default:
59  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid ChatProvider: {0}", settings.Provider));
60  }
61  }
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Chat.ProviderFactory.application
+
+private
+
+ +

The IApplication for the ProviderFactory

+ +

Definition at line 17 of file ProviderFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.ProviderFactory.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the ProviderFactory

+ +

Definition at line 22 of file ProviderFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Chat.ProviderFactory.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the ProviderFactory

+ +

Definition at line 27 of file ProviderFactory.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_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..9501f991c9 --- /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,677 @@ + + + + + + +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 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

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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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  }
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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 81 of file DiscordProvider.cs.

+ +

References Tgstation.Server.Host.Components.Chat.Providers.Message.Content, Tgstation.Server.Host.Components.Chat.Channel.Id, and Tgstation.Server.Host.Components.Chat.User.Id.

+
82  {
83  if (e.Author.Id == client.CurrentUser.Id)
84  return Task.CompletedTask;
85 
86  var pm = e.Channel is IPrivateChannel;
87 
88  if (!pm && !mappedChannels.Contains(e.Channel.Id))
89  return e.MentionedUsers.Any(x => x.Id == client.CurrentUser.Id) ? SendMessage(e.Channel.Id, "I do not respond to this channel!", default) : Task.CompletedTask;
90 
91  var result = new Message
92  {
93  Content = e.Content,
94  User = new User
95  {
96  RealId = e.Author.Id,
97  Channel = new Channel
98  {
99  RealId = e.Channel.Id,
100  IsPrivate = pm,
101  ConnectionName = pm ? e.Author.Username : (e.Channel as ITextChannel)?.Guild.Name ?? "UNKNOWN",
102  FriendlyName = e.Channel.Name
103  //isAdmin and Tag populated by manager
104  },
105  FriendlyName = e.Author.Username,
106  Mention = NormalizeMention(e.Author.Mention)
107  }
108  };
109  EnqueueMessage(result);
110  return Task.CompletedTask;
111  }
override async Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
Send a message to the IProvider
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 114 of file DiscordProvider.cs.

+
115  {
116  if (Connected)
117  return true;
118 
119  try
120  {
121  await client.LoginAsync(TokenType.Bot, botToken, true).ConfigureAwait(false);
122 
123  cancellationToken.ThrowIfCancellationRequested();
124 
125  await client.StartAsync().ConfigureAwait(false);
126 
127  var channelsAvailable = new TaskCompletionSource<object>();
128  client.Ready += () =>
129  {
130  channelsAvailable.TrySetResult(null);
131  return Task.CompletedTask;
132  };
133  using (cancellationToken.Register(() => channelsAvailable.SetCanceled()))
134  await channelsAvailable.Task.ConfigureAwait(false);
135  }
136  catch (OperationCanceledException)
137  {
138  throw;
139  }
140  catch (Exception e)
141  {
142  logger.LogWarning("Error connecting to Discord: {0}", e);
143  return false;
144  }
145 
146  return true;
147  }
+ +
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 150 of file DiscordProvider.cs.

+
151  {
152  if (!Connected)
153  return;
154 
155  try
156  {
157  await client.StopAsync().ConfigureAwait(false);
158  cancellationToken.ThrowIfCancellationRequested();
159  await client.LogoutAsync().ConfigureAwait(false);
160  }
161  catch (OperationCanceledException)
162  {
163  throw;
164  }
165  catch (Exception e)
166  {
167  logger.LogWarning("Error disconnecting from discord: {0}", e);
168  }
169  }
+ +
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
+
+
+ +
+
+ + + + + +
+ + + + + + + +
override void Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Dispose ()
+
+virtual
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 172 of file DiscordProvider.cs.

+ +

References Tgstation.Server.Api.Models.ChatChannel.DiscordChannelId, Tgstation.Server.Host.Components.Chat.Channel.Id, Tgstation.Server.Api.Models.ChatChannel.IsAdminChannel, and Tgstation.Server.Api.Models.ChatChannel.Tag.

+
173  {
174  if (channels == null)
175  throw new ArgumentNullException(nameof(channels));
176 
177  if (!Connected)
178  throw new InvalidOperationException("Provider not connected!");
179 
180  Channel GetChannelForChatChannel(ChatChannel channel)
181  {
182  if (!channel.DiscordChannelId.HasValue)
183  throw new InvalidOperationException("ChatChannel missing DiscordChannelId!");
184 
185  if (!(client.GetChannel(channel.DiscordChannelId.Value) is ITextChannel discordChannel))
186  return null;
187 
188  return new Channel
189  {
190  RealId = discordChannel.Id,
191  IsAdmin = channel.IsAdminChannel == true,
192  ConnectionName = discordChannel.Guild.Name,
193  FriendlyName = discordChannel.Name,
194  IsPrivate = false,
195  Tag = channel.Tag
196  };
197  };
198 
199  var enumerator = channels.Select(x => GetChannelForChatChannel(x)).Where(x => x != null).ToList();
200 
201  lock (this)
202  {
203  mappedChannels.Clear();
204  mappedChannels.AddRange(enumerator.Select(x => x.RealId));
205  }
206 
207  return Task.FromResult<IReadOnlyList<Channel>>(enumerator);
208  }
Indicates a chat channel
Definition: ChatChannel.cs:8
+ +
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
string Tag
A custom tag users can define to group channels together
Definition: ChatChannel.cs:41
+
readonly List< ulong > mappedChannels
List<T> of mapped ITextChannel IEntity<TId>.Ids
+
ulong DiscordChannelId
The Discord channel ID
Definition: ChatChannel.cs:18
+
bool IsAdminChannel
If the ChatChannel is an admin channel
Definition: ChatChannel.cs:24
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 211 of file DiscordProvider.cs.

+
212  {
213  try
214  {
215  var channel = client.GetChannel(channelId) as IMessageChannel;
216  await (channel?.SendMessageAsync(message, false, null, new RequestOptions
217  {
218  CancelToken = cancellationToken
219  }) ?? Task.CompletedTask).ConfigureAwait(false);
220  }
221  catch (OperationCanceledException)
222  {
223  throw;
224  }
225  catch (Exception e)
226  {
227  logger.LogWarning("Error sending discord message: {0}", e);
228  }
229  }
+
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.botToken
+
+private
+
+ +

The token used for connecting to discord

+ +

Definition at line 45 of file DiscordProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly DiscordSocketClient Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client
+
+private
+
+ +

The DiscordSocketClient for the DiscordProvider

+ +

Definition at line 40 of file DiscordProvider.cs.

+ +
+
+ +
+
+ + + + +
override bool Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connected => client.ConnectionState == ConnectionState.Connected
+
+ +

+ +

Definition at line 19 of file DiscordProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<DiscordProvider> Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger
+
+private
+
+ +

The ILogger for the DiscordProvider

+ +

Definition at line 35 of file DiscordProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly List<ulong> Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels
+
+private
+
+ +

List<T> of mapped ITextChannel IEntity<TId>.Ids

+ +

Definition at line 50 of file DiscordProvider.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
override string Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.BotMention
+
+get
+
+ +

+ +

Definition at line 23 of file DiscordProvider.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_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..dc8466fd6c --- /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,138 @@ + + + + + + +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..3b9b39d061 --- /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,1036 @@ + + + + + + +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 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 101 of file IrcProvider.cs.

+ +

References Tgstation.Server.Host.Core.IApplication.VersionString.

+
102  {
103  if (application == null)
104  throw new ArgumentNullException(nameof(application));
105  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
106  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
107 
108  this.address = address ?? throw new ArgumentNullException(nameof(address));
109  this.port = port;
110  this.nickname = nickname ?? throw new ArgumentNullException(nameof(nickname));
111 
112  if (passwordType.HasValue && password == null)
113  throw new ArgumentNullException(nameof(password));
114 
115  if (password != null && !passwordType.HasValue)
116  throw new ArgumentNullException(nameof(passwordType));
117 
118  this.password = password;
119  this.passwordType = passwordType;
120 
121  client = new IrcFeatures
122  {
123  SupportNonRfc = true,
124  CtcpUserInfo = "You are going to play. And I am going to watch. And everything will be just fine...",
125  AutoRejoin = true,
126  AutoRejoinOnKick = true,
127  AutoRelogin = true,
128  AutoRetry = true,
129  AutoRetryLimit = TimeoutSeconds,
130  AutoRetryDelay = TimeoutSeconds,
131  ActiveChannelSyncing = true,
132  AutoNickHandling = true,
133  CtcpVersion = application.VersionString,
134  UseSsl = useSsl
135  };
136  if (useSsl)
137  client.ValidateServerCertificate = true; //dunno if it defaults to that or what
138 
139  client.OnChannelMessage += Client_OnChannelMessage;
140  client.OnQueryMessage += Client_OnQueryMessage;
141 
142  channelIdMap = new Dictionary<ulong, string>();
143  queryChannelIdMap = new Dictionary<ulong, string>();
144  channelIdCounter = 1;
145  disconnecting = false;
146  }
ulong channelIdCounter
Id counter for channelIdMap
Definition: IrcProvider.cs:77
+
readonly Dictionary< ulong, string > queryChannelIdMap
Map of Channel.RealIds to query users
Definition: IrcProvider.cs:72
+
readonly IrcFeatures client
The IrcFeatures client
Definition: IrcProvider.cs:41
+
readonly ushort port
Port of the server to connect to
Definition: IrcProvider.cs:50
+
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:67
+ +
readonly IrcPasswordType passwordType
The IrcPasswordType of password
Definition: IrcProvider.cs:62
+
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:58
+ + +
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 329 of file IrcProvider.cs.

+ +

References Tgstation.Server.Host.Components.Chat.Channel.Tag.

+
330  {
331  if (!Connected)
332  return;
333  try
334  {
335  await Task.Factory.StartNew(() =>
336  {
337  try
338  {
339  client.RfcQuit("Mr. Stark, I don't feel so good...", Priority.Critical); //priocritical otherwise it wont go through
340  }
341  catch (Exception e)
342  {
343  logger.LogWarning("Error quitting IRC: {0}", e);
344  }
345  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
346  Dispose();
347  await listenTask.ConfigureAwait(false);
348  }
349  catch (OperationCanceledException)
350  {
351  throw;
352  }
353  catch (Exception e)
354  {
355  logger.LogWarning("Error disconnecting from IRC! Exception: {0}", e);
356  }
357  }
+
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:82
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + +
override void Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Dispose ()
+
+virtual
+
+ +

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Definition at line 149 of file IrcProvider.cs.

+
150  {
151  if (Connected)
152  {
153  disconnecting = true;
154  client.Disconnect(); //just closes the socket
155  }
156  }
readonly IrcFeatures client
The IrcFeatures client
Definition: IrcProvider.cs:41
+ + +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 163 of file IrcProvider.cs.

+
164  {
165  if (e.Data.Nick.ToUpperInvariant() == client.Nickname.ToUpperInvariant())
166  return;
167 
168  var username = e.Data.Nick;
169  var channelName = isPrivate ? username : e.Data.Channel;
170 
171  ulong MapAndGetChannelId(Dictionary<ulong, string> dicToCheck)
172  {
173  ulong? resultId = null;
174  if (!dicToCheck.Any(x =>
175  {
176  if (x.Value != channelName)
177  return false;
178  resultId = x.Key;
179  return true;
180  }))
181  {
182  resultId = channelIdCounter++;
183  dicToCheck.Add(resultId.Value, channelName);
184  if (dicToCheck == queryChannelIdMap)
185  channelIdMap.Add(resultId.Value, null);
186  }
187  return resultId.Value;
188  };
189 
190  ulong userId, channelId;
191  lock (this)
192  {
193  userId = MapAndGetChannelId(queryChannelIdMap);
194  channelId = isPrivate ? userId : MapAndGetChannelId(channelIdMap);
195  }
196 
197  var message = new Message
198  {
199  Content = e.Data.Message,
200  User = new User
201  {
202  Channel = new Channel
203  {
204  ConnectionName = address,
205  FriendlyName = isPrivate ? String.Format(CultureInfo.InvariantCulture, "PM: {0}", channelName) : channelName,
206  RealId = channelId,
207  IsPrivate = isPrivate
208  //isAdmin and Tag populated by manager
209  },
210  FriendlyName = username,
211  RealId = userId,
212  Mention = username
213  }
214  };
215 
216  EnqueueMessage(message);
217  }
ulong channelIdCounter
Id counter for channelIdMap
Definition: IrcProvider.cs:77
+
readonly Dictionary< ulong, string > queryChannelIdMap
Map of Channel.RealIds to query users
Definition: IrcProvider.cs:72
+
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:67
+ +
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken)
Definition: Provider.cs:40
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override Task<IReadOnlyList<Channel> > Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.MapChannels (IEnumerable< ChatChannelchannels,
CancellationToken cancellationToken 
)
+
+virtual
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.address
+
+private
+
+ +

Address of the server to connect to

+ +

Definition at line 46 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the IrcProvider

+ +

Definition at line 31 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + +
override string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.BotMention => client.Nickname
+
+ +

+ +

Definition at line 26 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdCounter
+
+private
+
+ +

Id counter for channelIdMap

+ +

Definition at line 77 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<ulong, string> Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdMap
+
+private
+
+ +

Map of Channel.RealIds to channel names

+ +

Definition at line 67 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IrcFeatures Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.client
+
+private
+
+ +

The IrcFeatures client

+ +

Definition at line 41 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + +
override bool Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connected => client.IsConnected
+
+ +

+ +

Definition at line 23 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.disconnecting
+
+private
+
+ +

If we are disconnecting

+ +

Definition at line 87 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.listenTask
+
+private
+
+ +

The Task used for IrcConnection.Listen(bool)

+ +

Definition at line 82 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<IrcProvider> Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger
+
+private
+
+ +

The ILogger for the IrcProvider

+ +

Definition at line 36 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.nickname
+
+private
+
+ +

IRC nickname

+ +

Definition at line 54 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.password
+
+private
+
+ +

Password which will used for authentication

+ +

Definition at line 58 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IrcPasswordType Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.passwordType
+
+private
+
+ +

The IrcPasswordType of password

+ +

Definition at line 62 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ushort Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.port
+
+private
+
+ +

Port of the server to connect to

+ +

Definition at line 50 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<ulong, string> Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.queryChannelIdMap
+
+private
+
+ +

Map of Channel.RealIds to query users

+ +

Definition at line 72 of file IrcProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.TimeoutSeconds = 5
+
+private
+
+ +

Definition at line 20 of file IrcProvider.cs.

+ +
+
+
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..0d50ebfb1f --- /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,111 @@ + + + + + + +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..9f4b9092ad --- /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,182 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Providers.Message.Content
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

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..3e2f3a374b --- /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,122 @@ + + + + + + +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..452f368f74 --- /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,549 @@ + + + + + + +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 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

+ +
+
+ + + + + +
+ + + + + + + +
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&#39;t empty
Definition: Provider.cs:19
+
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Task<bool> Tgstation.Server.Host.Components.Chat.Providers.Provider.Connect (CancellationToken cancellationToken)
+
+pure virtual
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
abstract void Tgstation.Server.Host.Components.Chat.Providers.Provider.Dispose ()
+
+pure virtual
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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&#39;t empty
Definition: Provider.cs:19
+
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Task<IReadOnlyList<Channel> > Tgstation.Server.Host.Components.Chat.Providers.Provider.MapChannels (IEnumerable< ChatChannelchannels,
CancellationToken cancellationToken 
)
+
+pure virtual
+
+
+ +
+
+ + + + + + + + +
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 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&#39;t empty
Definition: Provider.cs:19
+
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
abstract Task Tgstation.Server.Host.Components.Chat.Providers.Provider.SendMessage (ulong channelId,
string message,
CancellationToken cancellationToken 
)
+
+pure virtual
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly Queue<Message> Tgstation.Server.Host.Components.Chat.Providers.Provider.messageQueue
+
+private
+
+ +

Queue<T> of received Messages

+ +

Definition at line 14 of file Provider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Chat.Providers.Provider.nextMessage
+
+private
+
+ +

TaskCompletionSource<TResult> that completes while messageQueue isn't empty

+ +

Definition at line 19 of file Provider.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
abstract string Tgstation.Server.Host.Components.Chat.Providers.Provider.BotMention
+
+get
+
+ +

+ +

Definition at line 34 of file Provider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
abstract bool Tgstation.Server.Host.Components.Chat.Providers.Provider.Connected
+
+get
+
+ +

+ +

Definition at line 31 of file Provider.cs.

+ +
+
+
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..983c92253e --- /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,229 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+
+ +
+
+ + + + + + + +
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  }
+
+
+
+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.TestConstructionAndDisposal ()
+
+ +

Definition at line 22 of file TestDiscordProvider.cs.

+ +

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Dispose().

+
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  }
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.testToken1
+
+private
+
+ +

Definition at line 13 of file TestDiscordProvider.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_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..d7b3fbc1c3 --- /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,111 @@ + + + + + + +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..dfcf2bc4f2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html @@ -0,0 +1,178 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Response.Message
+
+getset
+
+ +

The message string

+ +

Definition at line 13 of file Response.cs.

+ +
+
+
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..cd9c71dd3a --- /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,114 @@ + + + + + + +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..2922f027de --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html @@ -0,0 +1,263 @@ + + + + + + +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 Tgstation.Server.Host.Components.Chat.User.Channel
+
+getset
+
+ +

The Components.Chat.Channel the user spoke from

+ +

Definition at line 40 of file User.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.User.FriendlyName
+
+getset
+
+ +

The friendly name of the user

+ +

Definition at line 30 of file User.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.User.Mention
+
+getset
+
+ +

The text to mention the user

+ +

Definition at line 35 of file User.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.User.RealId
+
+getset
+
+ +

The internal user id

+ +

Definition at line 22 of file User.cs.

+ +
+
+
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..1b0289bf53 --- /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,129 @@ + + + + + + +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..813717f01a --- /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,781 @@ + + + + + + +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...
 
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...
 
Dictionary< long, int > jobLockCounts
 
+

Detailed Description

+

Standard IDmbFactory

+ +

Definition at line 17 of file DmbFactory.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 76 of file DmbFactory.cs.

+
77  {
78  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
79  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
80  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
81  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
82 
83  cleanupTask = Task.CompletedTask;
84  newerDmbTcs = new TaskCompletionSource<object>();
85  cleanupCts = new CancellationTokenSource();
86  jobLockCounts = new Dictionary<long, int>();
87  }
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:57
+ +
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:52
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:43
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the DmbFactory
Definition: DmbFactory.cs:48
+
TaskCompletionSource< object > newerDmbTcs
TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist
Definition: DmbFactory.cs:61
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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 96 of file DmbFactory.cs.

+ +

References Tgstation.Server.Api.Models.Internal.CompileJob.DirectoryName, and Tgstation.Server.Api.Models.Internal.CompileJob.Id.

+
97  {
98  async Task HandleCleanup()
99  {
100  var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token);
101  Task otherTask;
102  //lock (this) //already locked below
103  otherTask = cleanupTask;
104  await Task.WhenAll(otherTask, deleteJob).ConfigureAwait(false);
105  }
106  lock (this)
107  {
108  if (!jobLockCounts.TryGetValue(job.Id, out var currentVal) || currentVal == 1)
109  {
110  jobLockCounts.Remove(job.Id);
111  logger.LogDebug("Cleaning compile job {0} => {1}", job.Id, job.DirectoryName);
112  cleanupTask = HandleCleanup();
113  }
114  else
115  {
116  var decremented = --jobLockCounts[job.Id];
117  logger.LogTrace("Compile job {0} lock count now: {1}", job.Id, decremented);
118  }
119  }
120  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:57
+ + +
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:39
+
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:52
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:43
+
Guid DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 231 of file DmbFactory.cs.

+ +

References Tgstation.Server.Api.Models.Internal.CompileJob.DirectoryName.

+
232  {
233  List<long> jobIdsToSkip;
234  //don't clean locked directories
235  lock (this)
236  jobIdsToSkip = jobLockCounts.Select(x => x.Key).ToList();
237 
238  List<string> jobUidsToNotErase = null;
239 
240  //find the uids of locked directories
241  await databaseContextFactory.UseContext(async db =>
242  {
243  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);
244  }).ConfigureAwait(false);
245 
246  //add the other exemption
247  if (exceptThisOne != null)
248  jobUidsToNotErase.Add(exceptThisOne.DirectoryName.Value.ToString().ToUpperInvariant());
249 
250  //cleanup
251  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
252  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
253  int deleting = 0;
254  var tasks = directories.Select(async x =>
255  {
256  var nameOnly = ioManager.GetFileName(x);
257  if (jobUidsToNotErase.Contains(nameOnly.ToUpperInvariant()))
258  return;
259  try
260  {
261  ++deleting;
262  await ioManager.DeleteDirectory(x, cancellationToken).ConfigureAwait(false);
263  }
264  catch (OperationCanceledException)
265  {
266  throw;
267  }
268  catch (Exception e)
269  {
270  logger.LogWarning("Error deleting directory {0}! Exception: {1}", x, e);
271  }
272  }).ToList();
273  if (deleting > 0)
274  {
275  logger.LogDebug("Cleaning {0} unused game folders...", deleting);
276  await Task.WhenAll().ConfigureAwait(false);
277  }
278  }
+
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:39
+
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:43
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the DmbFactory
Definition: DmbFactory.cs:48
+
Guid DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the DmbFactory
Definition: DmbFactory.cs:35
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.DmbFactory.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 176 of file DmbFactory.cs.

+ +

References Tgstation.Server.Host.Components.Compiler.DmbProvider.Dispose(), and Tgstation.Server.Api.Models.Internal.CompileJob.Id.

+
177  {
178  if (compileJob == null)
179  throw new ArgumentNullException(nameof(compileJob));
180 
181  //ensure we have the entire compile job tree
182  await databaseContextFactory.UseContext(async db => compileJob = await db.CompileJobs.Where(x => x.Id == compileJob.Id)
183  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
184  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
185  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
186  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false); //can't wait to see that query
187 
188  logger.LogTrace("Loading compile job {0}...", compileJob.Id);
189  var providerSubmitted = false;
190  var newProvider = new DmbProvider(compileJob, ioManager, () =>
191  {
192  if (providerSubmitted)
193  CleanJob(compileJob);
194  });
195 
196  try
197  {
198  var primaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
199  var secondaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
200 
201  if (!(await primaryCheckTask.ConfigureAwait(false) && await secondaryCheckTask.ConfigureAwait(false)))
202  {
203  logger.LogWarning("Error loading compile job, .dmb missing!");
204  return null; //omae wa mou shinderu
205  }
206 
207  lock (this)
208  {
209  if (!jobLockCounts.TryGetValue(compileJob.Id, out int value))
210  {
211  value = 1;
212  jobLockCounts.Add(compileJob.Id, 1);
213  }
214  else
215  jobLockCounts[compileJob.Id] = ++value;
216 
217  logger.LogTrace("Compile job {0} lock count now: {1}", compileJob.Id, value);
218 
219  providerSubmitted = true;
220  return newProvider;
221  }
222  }
223  finally
224  {
225  if (!providerSubmitted)
226  newProvider.Dispose();
227  }
228  }
+ +
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:39
+
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:43
+
void CleanJob(CompileJob job)
Delete the Api.Models.Internal.CompileJob.DirectoryName of job
Definition: DmbFactory.cs:96
+
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 123 of file DmbFactory.cs.

+
124  {
125  if (job == null)
126  throw new ArgumentNullException(nameof(job));
127 
128  var newProvider = await FromCompileJob(job, cancellationToken).ConfigureAwait(false);
129  if (newProvider == null)
130  return;
131  lock (this)
132  {
133  nextDmbProvider?.Dispose();
134  nextDmbProvider = newProvider;
135  newerDmbTcs.SetResult(nextDmbProvider);
136  newerDmbTcs = new TaskCompletionSource<object>();
137  }
138  }
IDmbProvider nextDmbProvider
The latest DmbProvider
Definition: DmbFactory.cs:65
+
async Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
Definition: DmbFactory.cs:176
+
TaskCompletionSource< object > newerDmbTcs
TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist
Definition: DmbFactory.cs:61
+
+
+
+ +
+
+ + + + + + + + +
IDmbProvider Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb (int lockCount)
+
+ +

Gets the next IDmbProvider

+ +

Implements Tgstation.Server.Host.Components.Compiler.IDmbFactory.

+ +

Definition at line 141 of file DmbFactory.cs.

+ +

References Tgstation.Server.Host.Components.IDmbProvider.CompileJob, and Tgstation.Server.Api.Models.Internal.CompileJob.Id.

+
142  {
143  if (!DmbAvailable)
144  throw new InvalidOperationException("No .dmb available!");
145  if (lockCount < 0)
146  throw new ArgumentOutOfRangeException(nameof(lockCount), lockCount, "lockCount must be greater than or equal to 0!");
147  lock (this)
148  {
149  var jobId = nextDmbProvider.CompileJob.Id;
150  var incremented = jobLockCounts[jobId] += lockCount;
151  logger.LogTrace("Compile job {0} lock count now: {1}", jobId, incremented);
152  return nextDmbProvider;
153  }
154  }
IDmbProvider nextDmbProvider
The latest DmbProvider
Definition: DmbFactory.cs:65
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+ + +
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:43
+ +
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Compiler.DmbFactory.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DmbFactory.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 169 of file DmbFactory.cs.

+
170  {
171  using (cancellationToken.Register(() => cleanupCts.Cancel()))
172  await cleanupTask.ConfigureAwait(false);
173  }
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:57
+
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:52
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupCts
+
+private
+
+ +

The CancellationTokenSource for cleanupTask

+ +

Definition at line 52 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupTask
+
+private
+
+ +

Task representing calls to CleanJob(CompileJob)

+ +

Definition at line 57 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Compiler.DmbFactory.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the DmbFactory

+ +

Definition at line 35 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Compiler.DmbFactory.DmbAvailable => nextDmbProvider != null
+
+ +

+ +

Definition at line 30 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.Compiler.DmbFactory.instance
+
+private
+
+ +

The Api.Models.Instance for the DmbFactory

+ +

Definition at line 48 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Compiler.DmbFactory.ioManager
+
+private
+
+ +

The IIOManager for the DmbFactory

+ +

Definition at line 39 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Dictionary<long, int> Tgstation.Server.Host.Components.Compiler.DmbFactory.jobLockCounts
+
+private
+
+ +

Definition at line 67 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<DmbFactory> Tgstation.Server.Host.Components.Compiler.DmbFactory.logger
+
+private
+
+ +

The ILogger for the DmbFactory

+ +

Definition at line 43 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Compiler.DmbFactory.newerDmbTcs
+
+private
+
+ +

TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist

+ +

Definition at line 61 of file DmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Compiler.DmbFactory.nextDmbProvider
+
+private
+
+ +

The latest DmbProvider

+ +

Definition at line 65 of file DmbFactory.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Compiler.DmbFactory.OnNewerDmb
+
+get
+
+ +

+ +

Definition at line 21 of file DmbFactory.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_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..0779b7ad25 --- /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,119 @@ + + + + + + +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..f70da7a03c --- /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,406 @@ + + + + + + +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))
 
RevisionInformation RevisionInformation => CompileJob.RevisionInformation
 
+ + + + + + + + + + + + + + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 42 of file DmbProvider.cs.

+
43  {
44  CompileJob = compileJob ?? throw new ArgumentNullException(nameof(compileJob));
45  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
46  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
47  }
Action onDispose
The Action to run when Dispose is called
Definition: DmbProvider.cs:34
+ +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.DmbProvider.Dispose ()
+
+
+ +
+
+ + + + + + + +
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

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Compiler.DmbProvider.DmbName => String.Concat(CompileJob.DmeName, DreamMaker.DmbExtension)
+
+ +

+ +

Definition at line 11 of file DmbProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Compiler.DmbProvider.ioManager
+
+private
+
+ +

The IIOManager for the DmbProvider

+ +

Definition at line 30 of file DmbProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Action Tgstation.Server.Host.Components.Compiler.DmbProvider.onDispose
+
+private
+
+ +

The Action to run when Dispose is called

+ +

Definition at line 34 of file DmbProvider.cs.

+ +
+
+ +
+
+ + + + +
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.

+ +
+
+ +
+
+ + + + +
RevisionInformation Tgstation.Server.Host.Components.Compiler.DmbProvider.RevisionInformation => CompileJob.RevisionInformation
+
+ +

+ +

Definition at line 20 of file DmbProvider.cs.

+ +
+
+ +
+
+ + + + +
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 Tgstation.Server.Host.Components.Compiler.DmbProvider.CompileJob
+
+get
+
+ +

The CompileJob for the DmbProvider

+ +

Definition at line 25 of file DmbProvider.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_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..c92275b4c2 --- /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,131 @@ + + + + + + +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
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
RunDreamMaker(string dreamMakerPath, Models.CompileJob job, 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..bec0bb6782 --- /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,975 @@ + + + + + + +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...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 104 of file DreamMaker.cs.

+
105  {
106  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
107  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
108  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
109  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
110  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
111  this.application = application ?? throw new ArgumentNullException(nameof(application));
112  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
113  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
114  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
115  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
116  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
117  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:83
+
readonly StaticFiles.IConfiguration configuration
The StaticFiles.IConfiguration for DreamMaker
Definition: DreamMaker.cs:51
+
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:67
+
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for DreamMaker
Definition: DreamMaker.cs:59
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 270 of file DreamMaker.cs.

+ +

References Tgstation.Server.Host.Components.Repository.IRepository.CopyTo(), and Tgstation.Server.Host.Components.Repository.IRepository.Origin.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+
271  {
272  if (revisionInformation == null)
273  throw new ArgumentNullException(nameof(revisionInformation));
274 
275  if (dreamMakerSettings == null)
276  throw new ArgumentNullException(nameof(dreamMakerSettings));
277 
278  if (repository == null)
279  throw new ArgumentNullException(nameof(repository));
280 
281  if (progressReporter == null)
282  throw new ArgumentNullException(nameof(progressReporter));
283 
284  if (dreamMakerSettings.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
285  throw new ArgumentOutOfRangeException(nameof(dreamMakerSettings), dreamMakerSettings, "Cannot compile with ultrasafe security!");
286 
287  logger.LogTrace("Begin Compile");
288 
289  var job = new Models.CompileJob
290  {
291  DirectoryName = Guid.NewGuid(),
292  DmeName = dreamMakerSettings.ProjectName,
293  RevisionInformation = revisionInformation
294  };
295 
296  logger.LogTrace("Compile output GUID: {0}", job.DirectoryName);
297 
298  lock (this)
299  {
300  if (compiling)
301  throw new JobException("There is already a compile job in progress!");
302  compiling = true;
303  }
304 
305  using (var progressCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
306  {
307  async Task ProgressTask()
308  {
309  if (!estimatedDuration.HasValue)
310  return;
311 
312  progressReporter(0);
313  var ct = progressCts.Token;
314  var sleepInterval = estimatedDuration.Value / 100;
315 
316  try
317  {
318  for (var I = 0; I < 99; ++I)
319  {
320  await Task.Delay(sleepInterval, progressCts.Token).ConfigureAwait(false);
321  progressReporter(I + 1);
322  }
323  }
324  catch (OperationCanceledException) { }
325  }
326 
327  var progressTask = ProgressTask();
328  try
329  {
330 
331 
332  var commitInsert = revisionInformation.CommitSha.Substring(0, 7);
333  string remoteCommitInsert;
334  if (revisionInformation.CommitSha == revisionInformation.OriginCommitSha)
335  {
336  commitInsert = String.Format(CultureInfo.InvariantCulture, "^{0}", commitInsert);
337  remoteCommitInsert = String.Empty;
338  }
339  else
340  remoteCommitInsert = String.Format(CultureInfo.InvariantCulture, ". Remote commit: ^{0}", revisionInformation.OriginCommitSha.Substring(0, 7));
341 
342  var testmergeInsert = revisionInformation.ActiveTestMerges.Count == 0 ? String.Empty : String.Format(CultureInfo.InvariantCulture, " (Test Merges: {0})",
343  String.Join(", ", revisionInformation.ActiveTestMerges.Select(x => x.TestMerge).Select(x =>
344  {
345  var result = String.Format(CultureInfo.InvariantCulture, "#{0} at {1}", x.Number, x.PullRequestRevision.Substring(0, 7));
346  if (x.Comment != null)
347  result += String.Format(CultureInfo.InvariantCulture, " ({0})", x.Comment);
348  return result;
349  })));
350 
351  using (var byondLock = await byond.UseExecutables(null, cancellationToken).ConfigureAwait(false))
352  {
353  await chat.SendUpdateMessage(String.Format(CultureInfo.InvariantCulture, "Deploying revision: {0}{1}{2} BYOND Version: {3}", commitInsert, testmergeInsert, remoteCommitInsert, byondLock.Version), cancellationToken).ConfigureAwait(false);
354 
355  async Task CleanupFailedCompile(bool cancelled)
356  {
357  logger.LogTrace("Cleaning compile directory...");
358  var chatTask = chat.SendUpdateMessage(cancelled ? "Deploy cancelled!" : "Deploy failed!", cancellationToken);
359  try
360  {
361  await ioManager.DeleteDirectory(job.DirectoryName.ToString(), CancellationToken.None).ConfigureAwait(false);
362  }
363  catch (Exception e)
364  {
365  logger.LogWarning("Error cleaning up compile directory {0}! Exception: {1}", ioManager.ResolvePath(job.DirectoryName.ToString()), e);
366  }
367 
368  await chatTask.ConfigureAwait(false);
369  };
370 
371  try
372  {
373  await ioManager.CreateDirectory(job.DirectoryName.ToString(), cancellationToken).ConfigureAwait(false);
374 
375  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
376  var dirB = ioManager.ConcatPath(job.DirectoryName.ToString(), BDirectoryName);
377 
378  logger.LogTrace("Copying repository to game directory...");
379  //copy the repository
380  var fullDirA = ioManager.ResolvePath(dirA);
381  var repoOrigin = repository.Origin;
382  using (repository)
383  await repository.CopyTo(fullDirA, cancellationToken).ConfigureAwait(false);
384 
385  //run precompile scripts
386  var resolvedGameDirectory = ioManager.ResolvePath(ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName));
387  await eventConsumer.HandleEvent(EventType.CompileStart, new List<string> { resolvedGameDirectory, repoOrigin }, cancellationToken).ConfigureAwait(false);
388 
389  //determine the dme
390  if (job.DmeName == null)
391  {
392  logger.LogTrace("Searching for available .dmes...");
393  var path = (await ioManager.GetFilesWithExtension(dirA, DmeExtension, cancellationToken).ConfigureAwait(false)).FirstOrDefault();
394  if (path == default)
395  throw new JobException("Unable to find any .dme!");
396  var dmeWithExtension = ioManager.GetFileName(path);
397  job.DmeName = dmeWithExtension.Substring(0, dmeWithExtension.Length - DmeExtension.Length - 1);
398  }
399  else if (!await ioManager.FileExists(ioManager.ConcatPath(dirA, String.Join('.', job.DmeName, DmeExtension)), cancellationToken).ConfigureAwait(false))
400  throw new JobException("Unable to locate specified .dme!");
401 
402  logger.LogDebug("Selected {0}.dme for compilation!", job.DmeName);
403 
404  await ModifyDme(job, cancellationToken).ConfigureAwait(false);
405 
406  //run compiler, verify api
407  job.ByondVersion = byondLock.Version.ToString();
408 
409  var exitCode = await RunDreamMaker(byondLock.DreamMakerPath, job, cancellationToken).ConfigureAwait(false);
410 
411  try
412  {
413  if (exitCode != 0)
414  throw new JobException(String.Format(CultureInfo.InvariantCulture, "DM exited with a non-zero code: {0}{1}{2}", exitCode, Environment.NewLine, job.Output));
415 
416  await VerifyApi(apiValidateTimeout, dreamMakerSettings.ApiValidationSecurityLevel.Value, job, byondLock, dreamMakerSettings.ApiValidationPort.Value, cancellationToken).ConfigureAwait(false);
417  }
418  catch (JobException)
419  {
420  //server never validated or compile failed
421  await eventConsumer.HandleEvent(EventType.CompileFailure, new List<string> { resolvedGameDirectory, exitCode == 0 ? "1" : "0" }, cancellationToken).ConfigureAwait(false);
422  throw;
423  }
424 
425  logger.LogTrace("Running post compile event...");
426  await eventConsumer.HandleEvent(EventType.CompileComplete, new List<string> { ioManager.ResolvePath(ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName)) }, cancellationToken).ConfigureAwait(false);
427 
428  logger.LogTrace("Duplicating compiled game...");
429 
430  //duplicate the dmb et al
431  await ioManager.CopyDirectory(dirA, dirB, null, cancellationToken).ConfigureAwait(false);
432 
433  logger.LogTrace("Applying static game file symlinks...");
434 
435  //symlink in the static data
436  var symATask = configuration.SymlinkStaticFilesTo(fullDirA, cancellationToken);
437  var symBTask = configuration.SymlinkStaticFilesTo(ioManager.ResolvePath(dirB), cancellationToken);
438 
439  await Task.WhenAll(symATask, symBTask).ConfigureAwait(false);
440 
441  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);
442 
443  logger.LogDebug("Compile complete!");
444  return job;
445  }
446  catch (Exception e)
447  {
448  await CleanupFailedCompile(e is OperationCanceledException).ConfigureAwait(false);
449  throw;
450  }
451  }
452  }
453  catch (OperationCanceledException)
454  {
455  await eventConsumer.HandleEvent(EventType.CompileCancelled, null, default).ConfigureAwait(false);
456  throw;
457  }
458  finally
459  {
460  compiling = false;
461  progressCts.Cancel();
462  await progressTask.ConfigureAwait(false);
463  }
464  }
465  }
+
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:83
+
readonly StaticFiles.IConfiguration configuration
The StaticFiles.IConfiguration for DreamMaker
Definition: DreamMaker.cs:51
+
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:30
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
bool compiling
If a compile job is running
Definition: DreamMaker.cs:88
+
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:67
+
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:129
+
string Origin
The current origin remote the IRepository is using
Definition: IRepository.cs:46
+
async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
Adds server side includes to the .dme being compiled
Definition: DreamMaker.cs:221
+
readonly IChat chat
The IChat for DreamMaker
Definition: DreamMaker.cs:71
+
readonly IWatchdog watchdog
The IWatchdog for DreamMaker
Definition: DreamMaker.cs:79
+
Task CopyTo(string path, CancellationToken cancellationToken)
Copies the current working directory to a given path
+
const string DmeExtension
Extension for .dmes
Definition: DreamMaker.cs:38
+
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+
Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation&#39;s location and return a IByondExecutableLock
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:47
+
Represents information about a current git revison
+
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:199
+
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:43
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 221 of file DreamMaker.cs.

+
222  {
223  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
224  var dmeFileName = String.Join('.', job.DmeName, DmeExtension);
225  var dmePath = ioManager.ConcatPath(dirA, dmeFileName);
226  var dmeReadTask = ioManager.ReadAllBytes(dmePath, cancellationToken);
227 
228  var dmeModificationsTask = configuration.CopyDMFilesTo(dmeFileName, ioManager.ResolvePath(dirA), cancellationToken);
229 
230  var dmeBytes = await dmeReadTask.ConfigureAwait(false);
231  var dme = Encoding.UTF8.GetString(dmeBytes);
232 
233  var dmeModifications = await dmeModificationsTask.ConfigureAwait(false);
234 
235  if (dmeModifications == null || dmeModifications.TotalDmeOverwrite)
236  {
237  if (dmeModifications != null)
238  logger.LogDebug(".dme replacement configured!");
239  else
240  logger.LogTrace("No .dme modifications required.");
241  return;
242  }
243 
244  if (dmeModifications.HeadIncludeLine != null)
245  logger.LogDebug("Head .dme include line: {0}", dmeModifications.HeadIncludeLine);
246  if (dmeModifications.TailIncludeLine != null)
247  logger.LogDebug("Tail .dme include line: {0}", dmeModifications.TailIncludeLine);
248 
249  var dmeLines = new List<string>(dme.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
250  for (var I = 0; I < dmeLines.Count; ++I)
251  {
252  var line = dmeLines[I];
253  if (line.Contains("BEGIN_INCLUDE", StringComparison.Ordinal) && dmeModifications.HeadIncludeLine != null)
254  {
255  dmeLines.Insert(I + 1, dmeModifications.HeadIncludeLine);
256  ++I;
257  }
258  else if (line.Contains("END_INCLUDE", StringComparison.Ordinal) && dmeModifications.TailIncludeLine != null)
259  {
260  dmeLines.Insert(I, dmeModifications.TailIncludeLine);
261  break;
262  }
263  }
264 
265  dmeBytes = Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, dmeLines));
266  await ioManager.WriteAllBytes(dmePath, dmeBytes, cancellationToken).ConfigureAwait(false);
267  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:83
+
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:51
+
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:38
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:47
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 199 of file DreamMaker.cs.

+
200  {
201  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))
202  {
203  int exitCode;
204  using (cancellationToken.Register(() => dm.Terminate()))
205  exitCode = await dm.Lifetime.ConfigureAwait(false);
206  cancellationToken.ThrowIfCancellationRequested();
207 
208  logger.LogDebug("DreamMaker exit code: {0}", exitCode);
209  job.Output = dm.GetCombinedOutput();
210  logger.LogTrace("DreamMaker output: {0}{1}", Environment.NewLine, job.Output);
211  return exitCode;
212  }
213  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:83
+
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:75
+
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:38
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:47
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 129 of file DreamMaker.cs.

+
130  {
131  logger.LogTrace("Verifying DMAPI...");
132  var launchParameters = new DreamDaemonLaunchParameters
133  {
134  AllowWebClient = false,
135  PrimaryPort = portToUse,
136  SecurityLevel = securityLevel, //all it needs to read the file and exit
137  StartupTimeout = timeout
138  };
139 
140  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
141 
142  job.MinimumSecurityLevel = securityLevel; //needed for the TempDmbProvider
143  var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job);
144 
145  var timeoutAt = DateTimeOffset.Now.AddSeconds(timeout);
146  using (var controller = await sessionControllerFactory.LaunchNew(launchParameters, provider, byondLock, true, true, true, cancellationToken).ConfigureAwait(false))
147  {
148  var launchResult = await controller.LaunchResult.ConfigureAwait(false);
149 
150  var now = DateTimeOffset.Now;
151  if (now < timeoutAt && launchResult.StartupTime.HasValue)
152  {
153  var timeoutTask = Task.Delay(timeoutAt - now, cancellationToken);
154 
155  await Task.WhenAny(controller.Lifetime, timeoutTask).ConfigureAwait(false);
156  cancellationToken.ThrowIfCancellationRequested();
157  }
158 
159  if (controller.Lifetime.IsCompleted)
160  {
161  var validationStatus = controller.ApiValidationStatus;
162  logger.LogTrace("API validation status: {0}", validationStatus);
163  switch (validationStatus)
164  {
165  case ApiValidationStatus.RequiresUltrasafe:
166  job.MinimumSecurityLevel = DreamDaemonSecurity.Ultrasafe;
167  return;
168  case ApiValidationStatus.RequiresSafe:
169  if (securityLevel == DreamDaemonSecurity.Ultrasafe)
170  throw new JobException("This game must be run with at least the 'Safe' DreamDaemon security level!");
171  job.MinimumSecurityLevel = DreamDaemonSecurity.Safe;
172  return;
173  case ApiValidationStatus.RequiresTrusted:
174  if (securityLevel != DreamDaemonSecurity.Trusted)
175  throw new JobException("This game must be run with at least the 'Trusted' DreamDaemon security level!");
176  job.MinimumSecurityLevel = DreamDaemonSecurity.Trusted;
177  return;
178  case ApiValidationStatus.NeverValidated:
179  break;
180  case ApiValidationStatus.BadValidationRequest:
181  throw new JobException("Recieved an unrecognized API validation request from DreamDaemon!");
182  case ApiValidationStatus.UnaskedValidationRequest:
183  default:
184  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Session controller returned unexpected ApiValidationStatus: {0}", validationStatus));
185  }
186  }
187 
188  throw new JobException("DMAPI validation timed out!");
189  }
190  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:83
+ +
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:55
+
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:34
+
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:47
+
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.ADirectoryName = "A"
+
+ +

Name of the primary directory used for compilation

+ +

Definition at line 26 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Compiler.DreamMaker.application
+
+private
+
+ +

The IApplication for DreamMaker

+ +

Definition at line 63 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.BDirectoryName = "B"
+
+ +

Name of the secondary directory used for compilation

+ +

Definition at line 30 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Compiler.DreamMaker.byond
+
+private
+
+ +

The IByondManager for DreamMaker

+ +

Definition at line 43 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IChat Tgstation.Server.Host.Components.Compiler.DreamMaker.chat
+
+private
+
+ +

The IChat for DreamMaker

+ +

Definition at line 71 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICompileJobConsumer Tgstation.Server.Host.Components.Compiler.DreamMaker.compileJobConsumer
+
+private
+
+ +

The ICompileJobConsumer for DreamMaker

+ +

Definition at line 59 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Compiler.DreamMaker.compiling
+
+private
+
+ +

If a compile job is running

+ +

Definition at line 88 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly StaticFiles.IConfiguration Tgstation.Server.Host.Components.Compiler.DreamMaker.configuration
+
+private
+
+ +

The StaticFiles.IConfiguration for DreamMaker

+ +

Definition at line 51 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.DmbExtension = ".dmb"
+
+ +

Extension for .dmbs

+ +

Definition at line 34 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.DmeExtension = "dme"
+
+private
+
+ +

Extension for .dmes

+ +

Definition at line 38 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Compiler.DreamMaker.eventConsumer
+
+private
+
+ +

The IEventConsumer for DreamMaker

+ +

Definition at line 67 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager
+
+private
+
+ +

The IIOManager for DreamMaker

+ +

Definition at line 47 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<DreamMaker> Tgstation.Server.Host.Components.Compiler.DreamMaker.logger
+
+private
+
+ +

The ILogger for DreamMaker

+ +

Definition at line 83 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.Compiler.DreamMaker.processExecutor
+
+private
+
+ +

The IProcessExecutor for DreamMaker

+ +

Definition at line 75 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISessionControllerFactory Tgstation.Server.Host.Components.Compiler.DreamMaker.sessionControllerFactory
+
+private
+
+ +

The ISessionControllerFactory for DreamMaker

+ +

Definition at line 55 of file DreamMaker.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog
+
+private
+
+ +

The IWatchdog for DreamMaker

+ +

Definition at line 79 of file DreamMaker.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_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..a9135bab60 --- /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,116 @@ + + + + + + +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..d8b6527259 --- /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,347 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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  }
+ + +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.Dispose ()
+
+ +

+ +

Definition at line 37 of file TemporaryDmbProvider.cs.

+
37 { }
+
+
+ +
+
+ + + + + + + +
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

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.SecondaryDirectory => throw new NotSupportedException()
+
+ +

+ +

Definition at line 18 of file TemporaryDmbProvider.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.CompileJob
+
+get
+
+ +

+ +

Definition at line 21 of file TemporaryDmbProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.DmbName
+
+get
+
+ +

+ +

Definition at line 12 of file TemporaryDmbProvider.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.PrimaryDirectory
+
+get
+
+ +

+ +

Definition at line 15 of file TemporaryDmbProvider.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_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..970e458fa5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html @@ -0,0 +1,297 @@ + + + + + + +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 More...
 
+

Detailed Description

+
+

Definition at line 11 of file EventConsumer.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Components.IEventConsumer.HandleEvent().

+
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
+
readonly IConfiguration configuration
The IConfiguration for the EventConsumer
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
+
+
+ +
+
+ + + + + + + + +
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  if (watchdog == null)
50  throw new ArgumentNullException(nameof(watchdog));
51  if (this.watchdog != null)
52  throw new InvalidOperationException("watchdog already set!");
53  this.watchdog = watchdog;
54  }
IWatchdog watchdog
The IWatchdog for the
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IConfiguration Tgstation.Server.Host.Components.EventConsumer.configuration
+
+private
+
+ +

The IConfiguration for the EventConsumer

+ +

Definition at line 16 of file EventConsumer.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IWatchdog Tgstation.Server.Host.Components.EventConsumer.watchdog
+
+private
+
+ +

The IWatchdog for the

+ +

Definition at line 21 of file EventConsumer.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_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..ec1682e455 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance-members.html @@ -0,0 +1,134 @@ + + + + + + +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.Instance
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.Instance
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..d1bf037b2a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html @@ -0,0 +1,1065 @@ + + + + + + +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]
 
IDreamMaker DreamMaker [get]
 
IWatchdog Watchdog [get]
 
IChat Chat [get]
 
StaticFiles.IConfiguration Configuration [get]
 
ICompileJobConsumer CompileJobConsumer [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 StaticFiles.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 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 22 of file Instance.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 106 of file Instance.cs.

+ +

References Tgstation.Server.Api.Rights.Configuration.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), Tgstation.Server.Host.Components.Watchdog.Watchdog.StartAsync(), and Tgstation.Server.Host.Components.Instance.TimerLoop().

+
107  {
108  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
109  RepositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
110  ByondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
111  DreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
112  Watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
113  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
114  Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
115  CompileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
116  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
117  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
118  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
119  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
120  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
121  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
122  }
+ +
readonly IEventConsumer eventConsumer
The IEventConsumer for the Instance
Definition: Instance.cs:63
+
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:78
+
readonly ILogger< Instance > logger
The ILogger for the Instance
Definition: Instance.cs:73
+
StaticFiles.IConfiguration Configuration
Definition: Instance.cs:40
+
ICompileJobConsumer CompileJobConsumer
Definition: Instance.cs:43
+ + + +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 136 of file Instance.cs.

+ +

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.DreamMaker.Compile(), Tgstation.Server.Host.Models.IDatabaseContext.CompileJobs, Tgstation.Server.Host.Models.IDatabaseContext.DreamDaemonSettings, Tgstation.Server.Host.Models.IDatabaseContext.DreamMakerSettings, 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.Repository.RepositoryManager.LoadRepository(), Tgstation.Server.Host.Models.TestMerge.MergedBy, 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.

+
137  {
138  //DO NOT FOLLOW THE SUGGESTION FOR A THROW EXPRESSION HERE
139  if (job == null)
140  throw new ArgumentNullException(nameof(job));
141  if (databaseContext == null)
142  throw new ArgumentNullException(nameof(databaseContext));
143  if (progressReporter == null)
144  throw new ArgumentNullException(nameof(progressReporter));
145 
146  var ddSettingsTask = databaseContext.DreamDaemonSettings.Where(x => x.InstanceId == metadata.Id).Select(x => new DreamDaemonSettings
147  {
148  StartupTimeout = x.StartupTimeout,
149  }).FirstOrDefaultAsync(cancellationToken);
150 
151  var compileJobsTask = databaseContext.CompileJobs
152  .Where(x => x.Job.Instance.Id == metadata.Id)
153  .OrderByDescending(x => x.Job.StoppedAt)
154  //TODO: Replace with this select when the issues linked in https://github.com/tgstation/tgstation-server/issues/737 are fixed
155  //.Select(x => x.Job.StoppedAt.Value - x.Job.StartedAt.Value)
156  .Select(x => new Job
157  {
158  StoppedAt = x.Job.StoppedAt,
159  StartedAt = x.Job.StartedAt
160  })
161  .Take(10)
162  .ToListAsync(cancellationToken);
163 
164  var dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
165  if (dreamMakerSettings == default)
166  throw new JobException("Missing DreamMakerSettings in DB!");
167  var ddSettings = await ddSettingsTask.ConfigureAwait(false);
168  if (ddSettings == default)
169  throw new JobException("Missing DreamDaemonSettings in DB!");
170 
171  Task<RepositorySettings> repositorySettingsTask = null;
172  string repoOwner = null;
173  string repoName = null;
174  CompileJob compileJob;
175  RevisionInformation revInfo;
176  using (var repo = await RepositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
177  {
178  if (repo == null)
179  throw new JobException("Missing Repository!");
180 
181  if (repo.IsGitHubRepository)
182  {
183  repoOwner = repo.GitHubOwner;
184  repoName = repo.GitHubRepoName;
185  repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).Select(x => new RepositorySettings
186  {
187  AccessToken = x.AccessToken,
188  ShowTestMergeCommitters = x.ShowTestMergeCommitters
189  }).FirstOrDefaultAsync(cancellationToken);
190  }
191 
192  var repoSha = repo.Head;
193  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);
194 
195  if (revInfo == default)
196  {
197  revInfo = new RevisionInformation
198  {
199  CommitSha = repoSha,
200  OriginCommitSha = repoSha,
201  Instance = new Models.Instance
202  {
203  Id = metadata.Id
204  }
205  };
206  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
207  databaseContext.Instances.Attach(revInfo.Instance);
208  }
209 
210  TimeSpan? averageSpan = null;
211  var previousCompileJobs = await compileJobsTask.ConfigureAwait(false);
212  if(previousCompileJobs.Count != 0)
213  {
214  var totalSpan = TimeSpan.Zero;
215  foreach (var I in previousCompileJobs)
216  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
217  averageSpan = totalSpan / previousCompileJobs.Count;
218  }
219 
220  compileJob = await DreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
221  }
222 
223  compileJob.Job = job;
224 
225  databaseContext.CompileJobs.Add(compileJob); //will be saved by job context
226 
227  job.PostComplete = ct => CompileJobConsumer.LoadCompileJob(compileJob, ct);
228 
229  if (repositorySettingsTask != null)
230  {
231  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
232  if (repositorySettings == default)
233  throw new JobException("Missing repository settings!");
234 
235  if (repositorySettings.AccessToken != null)
236  {
237  //potential for commenting on a test merge change
238  var outgoingCompileJob = LatestCompileJob();
239 
240  if(outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha != compileJob.RevisionInformation.CommitSha)
241  {
242  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
243 
244  async Task CommentOnPR(int prNumber, string comment)
245  {
246  try
247  {
248  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
249  }
250  catch (ApiException e)
251  {
252  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
253  }
254  }
255 
256  var tasks = new List<Task>();
257 
258  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}",
259  Environment.NewLine,
260  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
261  testMerge.PullRequestRevision,
262  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
263  updated ? "Updated" : "Deployed",
264  metadata.Name,
266  compileJob.RevisionInformation.CommitSha
267  );
268 
269  //added prs
270  foreach (var I in compileJob
272  .ActiveTestMerges
273  .Select(x => x.TestMerge)
274  .Where(x => !outgoingCompileJob
276  .ActiveTestMerges
277  .Any(y => y.TestMerge.Number == x.Number)))
278  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, false)));
279 
280  //removed prs
281  foreach (var I in outgoingCompileJob
283  .ActiveTestMerges
284  .Select(x => x.TestMerge)
285  .Where(x => !compileJob
288  .Any(y => y.TestMerge.Number == x.Number)))
289  tasks.Add(CommentOnPR(I.Number.Value, "#### Test Merge Removed"));
290 
291  //updated prs
292  foreach(var I in compileJob
294  .ActiveTestMerges
295  .Select(x => x.TestMerge)
296  .Where(x => outgoingCompileJob
297  .RevisionInformation
298  .ActiveTestMerges
299  .Any(y => y.TestMerge.Number == x.Number)))
300  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, true)));
301 
302  if (tasks.Any())
303  await Task.WhenAll(tasks).ConfigureAwait(false);
304  }
305  }
306  }
307  }
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:589
+ + +
DateTimeOffset StoppedAt
When the Job stopped
Definition: Job.cs:37
+
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:270
+
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:118
+
Job Job
See Api.Models.CompileJob.Job
Definition: CompileJob.cs:13
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the Instance
Definition: Instance.cs:68
+ +
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:78
+
Func< CancellationToken, Task > PostComplete
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
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:73
+
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
DbSet< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext
+
ICompileJobConsumer CompileJobConsumer
Definition: Instance.cs:43
+
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
+ + + +
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Instance.Dispose ()
+
+
+ +
+
+ + + + + + + +
CompileJob Tgstation.Server.Host.Components.Instance.LatestCompileJob ()
+
+ +

The latest staged CompileJob

+ +

Implements Tgstation.Server.Host.Components.IInstance.

+ +

Definition at line 589 of file Instance.cs.

+
590  {
592  return null;
593  return dmbFactory.LockNextDmb(0)?.CompileJob;
594  }
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
+
bool DmbAvailable
If LockNextDmb will succeed
Definition: IDmbFactory.cs:22
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the Instance
Definition: Instance.cs:53
+
+
+
+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Instance.Rename (string newName)
+
+ +

Rename the IInstance

+ +

Implements Tgstation.Server.Host.Components.IInstance.

+ +

Definition at line 534 of file Instance.cs.

+
535  {
536  if (String.IsNullOrWhiteSpace(newName))
537  throw new ArgumentNullException(nameof(newName));
538  metadata.Name = newName;
539  }
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:78
+
+
+
+ +
+
+ + + + + + + + +
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 561 of file Instance.cs.

+
562  {
563  Task toWait;
564  lock (this)
565  {
566  if (timerTask != null)
567  {
568  timerCts.Cancel();
569  toWait = timerTask;
570  }
571  else
572  toWait = Task.CompletedTask;
573  }
574  await toWait.ConfigureAwait(false);
575  if (newInterval == 0)
576  return;
577  lock (this)
578  {
579  //race condition, just quit
580  if (timerTask != null)
581  return;
582  timerCts?.Dispose();
583  timerCts = new CancellationTokenSource();
584  timerTask = TimerLoop(newInterval, timerCts.Token);
585  }
586  }
Task timerTask
The auto update Task
Definition: Instance.cs:83
+
CancellationTokenSource timerCts
CancellationTokenSource for timerTask
Definition: Instance.cs:87
+
async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
Pull the repository and compile for every set of given minutes
Definition: Instance.cs:315
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Instance.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 542 of file Instance.cs.

+ +

References Tgstation.Server.Api.Rights.Configuration, Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync(), Tgstation.Server.Host.Components.Chat.Chat.StartAsync(), Tgstation.Server.Host.Components.Watchdog.Watchdog.StartAsync(), Tgstation.Server.Host.Components.Byond.ByondManager.StopAsync(), Tgstation.Server.Host.Components.Chat.Chat.StopAsync(), and Tgstation.Server.Host.Components.Watchdog.Watchdog.StopAsync().

+
543  {
544  await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), CompileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
545 
546  //dependent on so many things, its just safer this way
547  await Watchdog.StartAsync(cancellationToken).ConfigureAwait(false);
548 
549  CompileJob latestCompileJob = null;
550  await databaseContextFactory.UseContext(async db =>
551  {
552  latestCompileJob = await db.CompileJobs.Where(x => x.Job.Instance.Id == metadata.Id).OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
553  }).ConfigureAwait(false);
554  await dmbFactory.CleanUnusedCompileJobs(latestCompileJob, cancellationToken).ConfigureAwait(false);
555  }
+
async Task SetAutoUpdateInterval(uint newInterval)
Change the Api.Models.Instance.AutoUpdateInterval for the IInstance
Definition: Instance.cs:561
+
async Task StartAsync(CancellationToken cancellationToken)
+
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:78
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Instance
Definition: Instance.cs:48
+
StaticFiles.IConfiguration Configuration
Definition: Instance.cs:40
+
ICompileJobConsumer CompileJobConsumer
Definition: Instance.cs:43
+ + +
async Task StartAsync(CancellationToken cancellationToken)
Definition: Watchdog.cs:956
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: Chat.cs:525
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the Instance
Definition: Instance.cs:53
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+ +
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Instance.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 315 of file Instance.cs.

+ +

References Tgstation.Server.Host.Models.RevisionInformation.ActiveTestMerges, Tgstation.Server.Api.Models.Internal.RevisionInformation.CommitSha, Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Models.RevisionInformation.Instance, Tgstation.Server.Host.Components.Instance.Instance(), Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository(), Tgstation.Server.Api.Models.Internal.RevisionInformation.OriginCommitSha, and Tgstation.Server.Host.Components.Repository.Repository.Repository().

+
316  {
317  while (true)
318  try
319  {
320  await Task.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : (int)minutes), cancellationToken).ConfigureAwait(false);
321  logger.LogDebug("Beginning auto update...");
322  await eventConsumer.HandleEvent(EventType.InstanceAutoUpdateStart, new List<string>(), cancellationToken).ConfigureAwait(false);
323  try
324  {
325  Models.User user = null;
326  await databaseContextFactory.UseContext(async (db) => user = await db.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
327  var repositoryUpdateJob = new Job
328  {
329  Instance = new Models.Instance
330  {
331  Id = metadata.Id
332  },
333  Description = "Scheduled repository update",
334  CancelRightsType = RightsType.Repository,
335  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
336  StartedBy = user
337  };
338 
339  string deploySha = null;
340  await jobManager.RegisterOperation(repositoryUpdateJob, async (paramJob, databaseContext, progressReporter, jobCancellationToken) =>
341  {
342  var repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(jobCancellationToken);
343 
344  //assume 5 steps with synchronize
345  const int ProgressSections = 7;
346  const int ProgressStep = 100 / ProgressSections;
347 
348 
349  const int NumSteps = 3;
350  var doneSteps = 0;
351 
352  Action<int> NextProgressReporter()
353  {
354  var tmpDoneSteps = doneSteps;
355  ++doneSteps;
356  return progress => progressReporter((progress + 100 * tmpDoneSteps) / NumSteps);
357  };
358 
359  using (var repo = await RepositoryManager.LoadRepository(jobCancellationToken).ConfigureAwait(false))
360  {
361  if (repo == null)
362  {
363  logger.LogTrace("Aborting repo update, no repository!");
364  return;
365  }
366 
367  var startSha = repo.Head;
368  if (!repo.Tracking)
369  {
370  logger.LogTrace("Aborting repo update, not tracking origin!");
371  deploySha = startSha;
372  return;
373  }
374 
375  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
376 
377  //the main point of auto update is to pull the remote
378  await repo.FetchOrigin(repositorySettings.AccessUser, repositorySettings.AccessToken, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
379 
380  RevisionInformation currentRevInfo = null;
381  bool hasDbChanges = false;
382 
383  Task<RevisionInformation> LoadRevInfo() => databaseContext.RevisionInformations
384  .Where(x => x.CommitSha == startSha && x.Instance.Id == metadata.Id)
385  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge)
386  .FirstOrDefaultAsync(cancellationToken);
387 
388  async Task UpdateRevInfo(string currentHead, bool onOrigin)
389  {
390  if(currentRevInfo == null)
391  currentRevInfo = await LoadRevInfo().ConfigureAwait(false);
392 
393  if (currentRevInfo == default)
394  {
395  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, currentHead);
396  onOrigin = true;
397  }
398 
399  var attachedInstance = new Models.Instance
400  {
401  Id = metadata.Id
402  };
403  var oldRevInfo = currentRevInfo;
404  currentRevInfo = new RevisionInformation
405  {
406  CommitSha = currentHead,
407  OriginCommitSha = onOrigin ? currentHead : oldRevInfo.OriginCommitSha,
408  Instance = attachedInstance
409  };
410  if (!onOrigin)
411  currentRevInfo.ActiveTestMerges = new List<RevInfoTestMerge>(oldRevInfo.ActiveTestMerges);
412 
413  databaseContext.Instances.Attach(attachedInstance);
414  databaseContext.RevisionInformations.Add(currentRevInfo);
415  hasDbChanges = true;
416  }
417 
418  //take appropriate auto update actions
419  bool shouldSyncTracked;
420  if (repositorySettings.AutoUpdatesKeepTestMerges.Value)
421  {
422  logger.LogTrace("Preserving test merges...");
423 
424  var currentRevInfoTask = LoadRevInfo();
425 
426  var result = await repo.MergeOrigin(repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
427 
428  if (!result.HasValue)
429  throw new JobException("Merge conflict while preserving test merges!");
430 
431  currentRevInfo = await currentRevInfoTask.ConfigureAwait(false);
432 
433  var lastRevInfoWasOriginCommit = currentRevInfo == default || currentRevInfo.CommitSha == currentRevInfo.OriginCommitSha;
434  var stillOnOrigin = result.Value && lastRevInfoWasOriginCommit;
435 
436  var currentHead = repo.Head;
437  if (currentHead != startSha)
438  {
439  await UpdateRevInfo(currentHead, stillOnOrigin).ConfigureAwait(false);
440  shouldSyncTracked = stillOnOrigin;
441  }
442  else
443  shouldSyncTracked = false;
444  }
445  else
446  {
447  logger.LogTrace("Not preserving test merges...");
448  await repo.ResetToOrigin(NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
449 
450  var currentHead = repo.Head;
451 
452  currentRevInfo = await databaseContext.RevisionInformations
453  .Where(x => x.CommitSha == currentHead && x.Instance.Id == metadata.Id)
454  .FirstOrDefaultAsync(jobCancellationToken).ConfigureAwait(false);
455 
456  if (currentHead != startSha && currentRevInfo != default)
457  await UpdateRevInfo(currentHead, true).ConfigureAwait(false);
458 
459  shouldSyncTracked = true;
460  }
461 
462  //synch if necessary
463  if (repositorySettings.AutoUpdatesSynchronize.Value && startSha != repo.Head)
464  {
465  var pushedOrigin = await repo.Sychronize(repositorySettings.AccessUser, repositorySettings.AccessToken, repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), shouldSyncTracked, jobCancellationToken).ConfigureAwait(false);
466  var currentHead = repo.Head;
467  if (currentHead != currentRevInfo.CommitSha)
468  await UpdateRevInfo(currentHead, pushedOrigin).ConfigureAwait(false);
469  }
470 
471  if(hasDbChanges)
472  try
473  {
474  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
475  }
476  catch
477  {
478  await repo.ResetToSha(startSha, progressReporter, default).ConfigureAwait(false);
479  throw;
480  }
481 
482  progressReporter(5 * ProgressStep);
483  deploySha = repo.Head;
484  }
485  }, cancellationToken).ConfigureAwait(false);
486 
487  await jobManager.WaitForJobCompletion(repositoryUpdateJob, user, cancellationToken, default).ConfigureAwait(false);
488 
489  if (deploySha == null)
490  {
491  logger.LogTrace("Aborting auto update, repository error!");
492  continue;
493  }
494 
496  {
497  logger.LogTrace("Aborting auto update, same revision as latest CompileJob");
498  continue;
499  }
500 
501  //finally set up the job
502  var compileProcessJob = new Job
503  {
504  StartedBy = user,
505  Instance = repositoryUpdateJob.Instance,
506  Description = "Scheduled code deployment",
507  CancelRightsType = RightsType.DreamMaker,
508  CancelRight = (ulong)DreamMakerRights.CancelCompile
509  };
510 
511  await jobManager.RegisterOperation(compileProcessJob, CompileProcess, cancellationToken).ConfigureAwait(false);
512 
513  await jobManager.WaitForJobCompletion(compileProcessJob, user, cancellationToken, default).ConfigureAwait(false);
514  }
515  catch (OperationCanceledException)
516  {
517  logger.LogDebug("Cancelled auto update job!");
518  throw;
519  }
520  catch (Exception e)
521  {
522  logger.LogWarning("Error in auto update loop! Exception: {0}", e);
523  continue;
524  }
525  }
526  catch (OperationCanceledException)
527  {
528  break;
529  }
530  logger.LogTrace("Leaving auto update loop...");
531  }
+
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
Definition: Instance.cs:136
+
CompileJob LatestCompileJob()
The latest staged CompileJob
Definition: Instance.cs:589
+
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:118
+
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:63
+ +
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:78
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Instance
Definition: Instance.cs:48
+
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:73
+
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:58
+
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Instance.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the Instance

+ +

Definition at line 48 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDmbFactory Tgstation.Server.Host.Components.Instance.dmbFactory
+
+private
+
+ +

The IDmbFactory for the Instance

+ +

Definition at line 53 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Instance.eventConsumer
+
+private
+
+ +

The IEventConsumer for the Instance

+ +

Definition at line 63 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Components.Instance.gitHubClientFactory
+
+private
+
+ +

The IGitHubClientFactory for the Instance

+ +

Definition at line 68 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.Instance.jobManager
+
+private
+
+ +

The IJobManager for the Instance

+ +

Definition at line 58 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Instance> Tgstation.Server.Host.Components.Instance.logger
+
+private
+
+ +

The ILogger for the Instance

+ +

Definition at line 73 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.Instance.metadata
+
+private
+
+ +

The Api.Models.Instance for the Instance

+ +

Definition at line 78 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Components.Instance.timerCts
+
+private
+
+ +

CancellationTokenSource for timerTask

+ +

Definition at line 87 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Instance.timerTask
+
+private
+
+ +

The auto update Task

+ +

Definition at line 83 of file Instance.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
IByondManager Tgstation.Server.Host.Components.Instance.ByondManager
+
+get
+
+ +

+ +

Definition at line 28 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IChat Tgstation.Server.Host.Components.Instance.Chat
+
+get
+
+ +

+ +

Definition at line 37 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ICompileJobConsumer Tgstation.Server.Host.Components.Instance.CompileJobConsumer
+
+get
+
+ +

+ +

Definition at line 43 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
StaticFiles.IConfiguration Tgstation.Server.Host.Components.Instance.Configuration
+
+get
+
+ +

+ +

Definition at line 40 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDreamMaker Tgstation.Server.Host.Components.Instance.DreamMaker
+
+get
+
+ +

+ +

Definition at line 31 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IRepositoryManager Tgstation.Server.Host.Components.Instance.RepositoryManager
+
+get
+
+ +

+ +

Definition at line 25 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IWatchdog Tgstation.Server.Host.Components.Instance.Watchdog
+
+get
+
+ +

+ +

Definition at line 34 of file Instance.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_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..ca57158c3e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory-members.html @@ -0,0 +1,131 @@ + + + + + + +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..82e5db4e69 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html @@ -0,0 +1,875 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 ILoggerFactory loggerFactory
The ILoggerFactory for the InstanceFactory
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the InstanceFactory
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
IInstance Tgstation.Server.Host.Components.InstanceFactory.CreateInstance (Models.Instance metadata)
+
+ +

Create an IInstance

+ +

Implements Tgstation.Server.Host.Components.IInstanceFactory.

+ +

Definition at line 155 of file InstanceFactory.cs.

+ +

References Tgstation.Server.Host.Components.Repository.Repository.Repository().

+
156  {
157  //Create the ioManager for the instance
158  var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
159 
160  //various other ioManagers
161  var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
162  var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
163  var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
164  var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
165 
166  var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, platformIdentifier, loggerFactory.CreateLogger<StaticFiles.Configuration>());
167  var eventConsumer = new EventConsumer(configuration);
168 
169  var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, loggerFactory.CreateLogger<DmbFactory>(), metadata.CloneMetadata());
170  try
171  {
172  var repoManager = new RepositoryManager(metadata.RepositorySettings, repoIoManager, eventConsumer, credentialsProvider, loggerFactory.CreateLogger<Repository.Repository>(), loggerFactory.CreateLogger<RepositoryManager>());
173  try
174  {
175  var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());
176 
177  var commandFactory = new CommandFactory(application, byond, repoManager, databaseContextFactory, metadata);
178 
179  var chat = chatFactory.CreateChat(instanceIoManager, commandFactory, metadata.ChatSettings);
180  try
181  {
182  var sessionControllerFactory = new SessionControllerFactory(processExecutor, byond, byondTopicSender, cryptographySuite, application, gameIoManager, chat, networkPromptReaper, platformIdentifier, loggerFactory, metadata.CloneMetadata());
183  var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, loggerFactory.CreateLogger<ReattachInfoHandler>(), metadata.CloneMetadata());
184  var watchdog = watchdogFactory.CreateWatchdog(chat, dmbFactory, reattachInfoHandler, configuration, sessionControllerFactory, metadata.CloneMetadata(), metadata.DreamDaemonSettings);
185  eventConsumer.SetWatchdog(watchdog);
186  commandFactory.SetWatchdog(watchdog);
187  try
188  {
189  var dreamMaker = new DreamMaker(byond, gameIoManager, configuration, sessionControllerFactory, dmbFactory, application, eventConsumer, chat, processExecutor, watchdog, loggerFactory.CreateLogger<DreamMaker>());
190 
191  return new Instance(metadata.CloneMetadata(), repoManager, byond, dreamMaker, watchdog, chat, configuration, dmbFactory, databaseContextFactory, dmbFactory, jobManager, eventConsumer, gitHubClientFactory, loggerFactory.CreateLogger<Instance>());
192  }
193  catch
194  {
195  watchdog.Dispose();
196  throw;
197  }
198  }
199  catch
200  {
201  chat.Dispose();
202  throw;
203  }
204  }
205  catch
206  {
207  repoManager.Dispose();
208  throw;
209  }
210  }
211  catch
212  {
213  dmbFactory.Dispose();
214  throw;
215  }
216  }
+
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:118
+
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
+ + + + +
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.InstanceFactory.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.InstanceFactory.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.InstanceFactory.application
+
+private
+
+ +

The IApplication for the InstanceFactory

+ +

Definition at line 34 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondInstaller Tgstation.Server.Host.Components.InstanceFactory.byondInstaller
+
+private
+
+ +

The IByondInstaller for the InstanceFactory

+ +

Definition at line 64 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.InstanceFactory.byondTopicSender
+
+private
+
+ +

The IByondTopicSender for the InstanceFactory

+ +

Definition at line 44 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IChatFactory Tgstation.Server.Host.Components.InstanceFactory.chatFactory
+
+private
+
+ +

The IProviderFactory for the InstanceFactory

+ +

Definition at line 69 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICredentialsProvider Tgstation.Server.Host.Components.InstanceFactory.credentialsProvider
+
+private
+
+ +

The ICredentialsProvider for the InstanceFactory

+ +

Definition at line 94 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Components.InstanceFactory.cryptographySuite
+
+private
+
+ +

The ICryptographySuite for the InstanceFactory

+ +

Definition at line 49 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.InstanceFactory.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the InstanceFactory

+ +

Definition at line 29 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Components.InstanceFactory.gitHubClientFactory
+
+private
+
+ +

The IGitHubClientFactory for the InstanceFactory

+ +

Definition at line 104 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.InstanceFactory.ioManager
+
+private
+
+ +

The IIOManager for the InstanceFactory

+ +

Definition at line 24 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.InstanceFactory.jobManager
+
+private
+
+ +

The IJobManager for the InstanceFactory

+ +

Definition at line 89 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.InstanceFactory.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the InstanceFactory

+ +

Definition at line 39 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly INetworkPromptReaper Tgstation.Server.Host.Components.InstanceFactory.networkPromptReaper
+
+private
+
+ +

The INetworkPromptReaper for the InstanceFactory

+ +

Definition at line 99 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Components.InstanceFactory.platformIdentifier
+
+private
+
+ +

The IPlatformIdentifier for the InstanceFactory

+ +

Definition at line 109 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPostWriteHandler Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler
+
+private
+
+ +

The IPostWriteHandler for the InstanceFactory

+ +

Definition at line 79 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.InstanceFactory.processExecutor
+
+private
+
+ +

The IProcessExecutor for the InstanceFactory

+ +

Definition at line 74 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISymlinkFactory Tgstation.Server.Host.Components.InstanceFactory.symlinkFactory
+
+private
+
+ +

The ISymlinkFactory for the InstanceFactory

+ +

Definition at line 59 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISynchronousIOManager Tgstation.Server.Host.Components.InstanceFactory.synchronousIOManager
+
+private
+
+ +

The ISynchronousIOManager for the InstanceFactory

+ +

Definition at line 54 of file InstanceFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IWatchdogFactory Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory
+
+private
+
+ +

The IWatchdogFactory for the InstanceFactory

+ +

Definition at line 84 of file InstanceFactory.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_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..b87a2489bd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager-members.html @@ -0,0 +1,126 @@ + + + + + + +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
GetInstance(Models.Instance metadata)Tgstation.Server.Host.Components.InstanceManager
instanceFactoryTgstation.Server.Host.Components.InstanceManagerprivate
InstanceManager(IInstanceFactory instanceFactory, IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, IJobManager jobManager, 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
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..ee9689580e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html @@ -0,0 +1,654 @@ + + + + + + +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 +IHostedService +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 InstanceManager (IInstanceFactory instanceFactory, IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, IJobManager jobManager, 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)
 
- 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 ILogger< InstanceManagerlogger
 The ILogger for the InstanceManager More...
 
readonly Dictionary< long, IInstanceinstances
 Map of Api.Models.Instance.Ids to respective IInstances More...
 
bool disposed
 If the InstanceManager has been Disposed More...
 
+

Detailed Description

+
+

Definition at line 15 of file InstanceManager.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.InstanceManager.InstanceManager (IInstanceFactory instanceFactory,
IIOManager ioManager,
IDatabaseContextFactory databaseContextFactory,
IApplication application,
IJobManager jobManager,
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
loggerThe value of logger
+
+
+ +

Definition at line 66 of file InstanceManager.cs.

+
67  {
68  this.instanceFactory = instanceFactory ?? throw new ArgumentNullException(nameof(instanceFactory));
69  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
70  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
71  this.application = application ?? throw new ArgumentNullException(nameof(application));
72  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
73  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
74 
75  instances = new Dictionary<long, IInstance>();
76  }
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.InstanceManager.Dispose ()
+
+ +

+ +

Definition at line 79 of file InstanceManager.cs.

+
80  {
81  lock (this)
82  {
83  if (disposed)
84  return;
85  disposed = true;
86  }
87  foreach (var I in instances)
88  I.Value.Dispose();
89  }
bool disposed
If the InstanceManager has been Disposed
+
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
+
+
+ +
+
+ + + + + + + + +
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 92 of file InstanceManager.cs.

+
93  {
94  if (metadata == null)
95  throw new ArgumentNullException(nameof(metadata));
96  lock (this)
97  {
98  if (!instances.TryGetValue(metadata.Id, out IInstance instance))
99  throw new InvalidOperationException("Instance not online!");
100  return instance;
101  }
102  }
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 105 of file InstanceManager.cs.

+
106  {
107  if (newPath == null)
108  throw new ArgumentNullException(nameof(newPath));
109  if (instance.Online.Value)
110  throw new InvalidOperationException("Cannot move an online instance!");
111  var oldPath = instance.Path;
112  await ioManager.CopyDirectory(oldPath, newPath, null, cancellationToken).ConfigureAwait(false);
114  {
115  var targetInstance = new Models.Instance
116  {
117  Id = instance.Id
118  };
119  db.Instances.Attach(targetInstance);
120  targetInstance.Path = newPath;
121  return db.Save(cancellationToken);
122  }).ConfigureAwait(false);
123  await ioManager.DeleteDirectory(oldPath, cancellationToken).ConfigureAwait(false);
124  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.InstanceManager.OfflineInstance (Models.Instance metadata,
Models.User user,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 127 of file InstanceManager.cs.

+
128  {
129  if (metadata == null)
130  throw new ArgumentNullException(nameof(metadata));
131  logger.LogInformation("Offlining instance ID {0}", metadata.Id);
132  IInstance instance;
133  lock (this)
134  {
135  if (!instances.TryGetValue(metadata.Id, out instance))
136  throw new InvalidOperationException("Instance not online!");
137  instances.Remove(metadata.Id);
138  }
139  try
140  {
141  //we are the one responsible for cancelling his jobs
142  var tasks = new List<Task>();
143  await databaseContextFactory.UseContext(async db =>
144  {
145  var jobs = db.Jobs.Where(x => x.Instance.Id == metadata.Id).Select(x => new Models.Job
146  {
147  Id = x.Id
148  }).ToAsyncEnumerable();
149  await jobs.ForEachAsync(job =>
150  {
151  lock (tasks)
152  tasks.Add(jobManager.CancelJob(job, user, true, cancellationToken));
153  }, cancellationToken).ConfigureAwait(false);
154  }).ConfigureAwait(false);
155 
156  await Task.WhenAll(tasks).ConfigureAwait(false);
157 
158  await instance.StopAsync(cancellationToken).ConfigureAwait(false);
159  }
160  finally
161  {
162  instance.Dispose();
163  }
164  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceManager
+
readonly IJobManager jobManager
The IJobManager for the InstanceManager
+
async Task StopAsync(CancellationToken cancellationToken)
+
readonly ILogger< InstanceManager > logger
The ILogger 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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 167 of file InstanceManager.cs.

+
168  {
169  if (metadata == null)
170  throw new ArgumentNullException(nameof(metadata));
171  logger.LogInformation("Onlining instance ID {0} ({1}) at {2}", metadata.Id, metadata.Name, metadata.Path);
172  var instance = instanceFactory.CreateInstance(metadata);
173  try
174  {
175  lock (this)
176  {
177  if (instances.ContainsKey(metadata.Id))
178  throw new InvalidOperationException("Instance already online!");
179  instances.Add(metadata.Id, instance);
180  }
181  }
182  catch
183  {
184  instance.Dispose();
185  throw;
186  }
187  await instance.StartAsync(cancellationToken).ConfigureAwait(false);
188  }
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
+
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.InstanceManager.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.InstanceManager.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 223 of file InstanceManager.cs.

+
224  {
225  await jobManager.StopAsync(cancellationToken).ConfigureAwait(false);
226  await Task.WhenAll(instances.Select(x => x.Value.StopAsync(cancellationToken))).ConfigureAwait(false);
227  await instanceFactory.StopAsync(cancellationToken).ConfigureAwait(false);
228  }
readonly IJobManager jobManager
The IJobManager 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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.InstanceManager.application
+
+private
+
+ +

The IApplication for the InstanceManager

+ +

Definition at line 35 of file InstanceManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the InstanceManager

+ +

Definition at line 30 of file InstanceManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.InstanceManager.disposed
+
+private
+
+ +

If the InstanceManager has been Disposed

+ +

Definition at line 55 of file InstanceManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IInstanceFactory Tgstation.Server.Host.Components.InstanceManager.instanceFactory
+
+private
+
+ +

The IInstanceFactory for the InstanceManager

+ +

Definition at line 20 of file InstanceManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<long, IInstance> Tgstation.Server.Host.Components.InstanceManager.instances
+
+private
+
+ +

Map of Api.Models.Instance.Ids to respective IInstances

+ +

Definition at line 50 of file InstanceManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.InstanceManager.ioManager
+
+private
+
+ +

The IIOManager for the InstanceManager

+ +

Definition at line 25 of file InstanceManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.InstanceManager.jobManager
+
+private
+
+ +

The IJobManager for the InstanceManager

+ +

Definition at line 40 of file InstanceManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<InstanceManager> Tgstation.Server.Host.Components.InstanceManager.logger
+
+private
+
+ +

The ILogger for the InstanceManager

+ +

Definition at line 45 of file InstanceManager.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_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..675c70ede5175adf2ccabce19fec9698cc0d9c80 GIT binary patch literal 1978 zcmbtUc~DbV7k?o@D4Vnbi3Ot$Q3GL#NC5>zWRVvLM!*D&gn)vdib*OE3?N2UsVEXr zl(1<*L0Kd?0w&ZTdsvDfBCB9*P!_2?MbH9YLOb@G`Tpwk&fIs;`^`D`oO^!1ds9hX zd$rWRR|fz<3v_q!1^~E7Zj;pD3Is|Gk}oKdr?2bE%8J~4GyO3#{mEsywK~OOu}bRj z2KldAgtwOuAa_!XK8dd-03bln#mV@-QFiDw|6XdN0Lf+Y@7as7{s(|8h3F+L;1=wy3?#Nk1PE z0xe_SPl@Bu?gRa?X^wW~H}a5O{Y%5!tX(1VHP;5D+bT`Beah|s2{#cH&K*Axwlo)@ z+mO}VA+j4eI8=Ly4B;qx-Fx zH+E+~2spsFXeQQzn#1e#;`WHvhUp8w;$-CNS`|Kvs6D#SH}LxRYoqSS$#(qudis(SEj_rIAV!F=sMPWZUFKIt`hmHn+~7nI?8++_FZi)_D>;A4HoDkk)+)f{cMauUa-&?~=r9^M zdDF52vkr_-@5F%)|3dn49ei)XmZD7Uj3U~fS1WP#Y60f$a50e6sIK&Zt^)I-j|0*7 z;{kaluGAh))*iDb>l7exYAhuUM0bLo@|${fCBuomHaG<9dz_jAu|1arSD>rmK?7gI z*ZSFV(WM)AuOaJqpb!^`|yCg8rz&CAf+-4P^BAo?cp}~ zSp#tVr5ze~`Vp<=GxHOHb^%jPfEjH>(lxa-u@*M2-oTzf6#Jt$&;}KCOVw0W=B7rf zN|&l!;+UgwxyPjCtl?F~Q5i1By7TRqmmq%EuLo=5>JH|=qzWdIph(B4G~!cHdqT)O zs!1;CC>pLj=Vd310XvyHXQq4juSX}QQr;)AyE@e6)@rfkA#O^C&_CH8+d8P*K_#x! zJ{Osqb@Cy7bR;QNBAb8F_vU?Zu`q-xF?pcK-MpV4RkbJdyxXgZ`CM-NA8hlG$N3|h zZ*hh^-Yq2(r zZkAfMXmHfcx{1t&7)=Gi77FT6ZI}LjAte5X3M`raYUu|?{azXL2`ZDK>pMhe`xcV@ z097#%n>#4F*@MP2@x%dNeiUD@?J4`r>r%QTeQASqG*>v7w_3EfOuDapS8v2(cAnOW zDP?6E5xPQBfo_vF_HSzcE_^oZRtLv5e0>W}a<_*}#ZvOQyZdH-_;FXOf(m3oMiPb4 zq0!i*S-(mRR=_g02PkxwsqmCSTy(<_eXri4xlG0(l*{7l5`r7575=irF;)P{=cH* BfXn~@ 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..1e3699b40a --- /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,112 @@ + + + + + + +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..85e0744e73 --- /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,192 @@ + + + + + + +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
+
+
+ + + + + + + + +

+Properties

string Command [get, set]
 
string Parameters [get, set]
 
User User [get, set]
 
+

Detailed Description

+
+

Definition at line 5 of file ChatCommand.cs.

+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.ChatCommand.Command
+
+getset
+
+ +

Definition at line 7 of file ChatCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.ChatCommand.Parameters
+
+getset
+
+ +

Definition at line 8 of file ChatCommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Components.Interop.ChatCommand.User
+
+getset
+
+ +

Definition at line 9 of file ChatCommand.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_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..f0b9f32179 --- /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,111 @@ + + + + + + +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..391fd7ddb5 --- /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,182 @@ + + + + + + +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, string > 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

+ +
+
+ + + + + +
+ + + + +
IReadOnlyDictionary<string, string> Tgstation.Server.Host.Components.Interop.CommCommand.Parameters
+
+getset
+
+ +

The dictionary of the CommCommand

+ +

Definition at line 13 of file CommCommand.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.CommCommand.RawJson
+
+getset
+
+ +

The raw JSON of the CommCommand

+ +

Definition at line 18 of file CommCommand.cs.

+ +

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..6904a349fa --- /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,120 @@ + + + + + + +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..6852629a29 --- /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,499 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.IO.IIOManager.ResolvePath().

+
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
+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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, string>>(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
+
+
+
+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly CancellationToken Tgstation.Server.Host.Components.Interop.CommContext.cancellationToken
+
+private
+
+ +

The CancellationToken for the CommContext

+ +

Definition at line 39 of file CommContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Interop.CommContext.cancellationTokenSource
+
+private
+
+ +

The CancellationTokenSource for the CommContext

+ +

Definition at line 34 of file CommContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Interop.CommContext.disposed
+
+private
+
+ +

If the CommContext has been disposed

+ +

Definition at line 49 of file CommContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly FileSystemWatcher Tgstation.Server.Host.Components.Interop.CommContext.fileSystemWatcher
+
+private
+
+ +

The FileSystemWatcher for the CommContext

+ +

Definition at line 29 of file CommContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ICommHandler Tgstation.Server.Host.Components.Interop.CommContext.handler
+
+private
+
+ +

The ICommHandler for the CommContext

+ +

Definition at line 44 of file CommContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Interop.CommContext.ioManager
+
+private
+
+ +

The IIOManager for the CommContext

+ +

Definition at line 19 of file CommContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<CommContext> Tgstation.Server.Host.Components.Interop.CommContext.logger
+
+private
+
+ +

The ILogger for the CommContext

+ +

Definition at line 24 of file CommContext.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_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..473edc2580 --- /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,126 @@ + + + + + + +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..c444988672 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html @@ -0,0 +1,426 @@ + + + + + + +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
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

const string DMParamHostVersion = "server_service_version"
 
const string DMParamInfoJson = "tgs_json"
 
const string DMInteropAccessIdentifier = "tgs_tok"
 
const string DMResponseSuccess = "tgs_succ"
 
const string DMTopicChangePort = "tgs_port"
 
const string DMTopicChangeReboot = "tgs_rmode"
 
const string DMTopicChatCommand = "tgs_chat_comm"
 
const string DMTopicEvent = "tgs_event"
 
const string DMTopicInteropResponse = "tgs_interop"
 
const string DMCommandNewPort = "tgs_new_port"
 
const string DMCommandApiValidate = "tgs_validate"
 
const string DMCommandServerPrimed = "tgs_prime"
 
const string DMCommandWorldReboot = "tgs_reboot"
 
const string DMCommandEndProcess = "tgs_kill"
 
const string DMCommandChat = "tgs_chat_send"
 
const string DMParameterCommand = "tgs_com"
 
const string DMParameterData = "tgs_data"
 
+

Detailed Description

+
+

Definition at line 3 of file Constants.cs.

+

Member Data Documentation

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandApiValidate = "tgs_validate"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandChat = "tgs_chat_send"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandEndProcess = "tgs_kill"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandNewPort = "tgs_new_port"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandServerPrimed = "tgs_prime"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandWorldReboot = "tgs_reboot"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMInteropAccessIdentifier = "tgs_tok"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMParameterCommand = "tgs_com"
+
+
+ + + +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMParamHostVersion = "server_service_version"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMParamInfoJson = "tgs_json"
+
+
+ + + +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangePort = "tgs_port"
+
+ +

Definition at line 15 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangeReboot = "tgs_rmode"
+
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicChatCommand = "tgs_chat_comm"
+
+ +

Definition at line 17 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleChatCommand().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicEvent = "tgs_event"
+
+ +

Definition at line 18 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleEvent().

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicInteropResponse = "tgs_interop"
+
+
+
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..fe5bce7dbe --- /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,111 @@ + + + + + + +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..3edbd02bbe --- /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,178 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
IEnumerable<string> Tgstation.Server.Host.Components.Interop.EventNotification.Parameters
+
+getset
+
+ +

The event parameters

+ +

Definition at line 18 of file EventNotification.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
EventType Tgstation.Server.Host.Components.Interop.EventNotification.Type
+
+getset
+
+ +

The EventType

+ +

Definition at line 13 of file EventNotification.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_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..652bfd9c69 --- /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,118 @@ + + + + + + +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..bfa300aa96 --- /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,367 @@ + + + + + + +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 [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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity Tgstation.Server.Host.Components.Interop.JsonFile.SecurityLevel
+
+getset
+
+ +

The DreamDaemonSecurity level of the launch

+ +

Definition at line 50 of file JsonFile.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<TestMerge> Tgstation.Server.Host.Components.Interop.JsonFile.TestMerges
+
+get
+
+ +

The TestMerges in the launch

+ +

Definition at line 55 of file JsonFile.cs.

+ +
+
+
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..e59d895d99 --- /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,114 @@ + + + + + + +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..3e751dcd3c --- /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,295 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList ()
+
+protected
+
+ +

Construct an JsonSubFileList

+ +

Definition at line 32 of file JsonSubFileList.cs.

+
32 { }
+
+
+ +
+
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatChannelsJson, Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatCommandsJson, and Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson.

+
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
+
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatChannelsJson
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatCommandsJson
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson
+
+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_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..4faf4dd046 --- /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,121 @@ + + + + + + +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..a93647b01e --- /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,268 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Components.Interop.TestMerge.Revision
+
+getset
+
+ +

The RevisionInformation of the TestMerge

+ +

Definition at line 20 of file TestMerge.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..9d19f6e114 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler-members.html @@ -0,0 +1,116 @@ + + + + + + +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..a20e7e77a3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html @@ -0,0 +1,369 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier, Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha, Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive, Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo, 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.Models.ReattachInformationBase.IsPrimary, Tgstation.Server.Host.Models.ReattachInformationBase.Port, Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId, Tgstation.Server.Host.Models.ReattachInformationBase.RebootState, and Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson.

+
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 ILogger< ReattachInfoHandler > logger
The ILogger for the ReattachInfoHandler
+
readonly Api.Models.Instance metadata
The Api.Models.Instance for the ReattachInfoHandler
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.ReattachInfoHandler.Save (WatchdogReattachInformation reattachInformation,
CancellationToken cancellationToken 
)
+
+ +

Save some reattachInformation

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.ReattachInfoHandler.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the ReattachInfoHandler

+ +

Definition at line 20 of file ReattachInfoHandler.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDmbFactory Tgstation.Server.Host.Components.ReattachInfoHandler.dmbFactory
+
+private
+
+ +

The IDmbFactory for the ReattachInfoHandler

+ +

Definition at line 25 of file ReattachInfoHandler.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<ReattachInfoHandler> Tgstation.Server.Host.Components.ReattachInfoHandler.logger
+
+private
+
+ +

The ILogger for the ReattachInfoHandler

+ +

Definition at line 30 of file ReattachInfoHandler.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.ReattachInfoHandler.metadata
+
+private
+
+ +

The Api.Models.Instance for the ReattachInfoHandler

+ +

Definition at line 35 of file ReattachInfoHandler.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_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..752eb0b731 --- /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,112 @@ + + + + + + +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..6eedf16b05 --- /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,230 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
CredentialsHandler Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler (string username,
string password 
)
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<CredentialsProvider> Tgstation.Server.Host.Components.Repository.CredentialsProvider.logger
+
+private
+
+ +

The ILogger for the CredentialsProvider

+ +

Definition at line 15 of file CredentialsProvider.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_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..453eebba51 --- /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,142 @@ + + + + + + +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..0257b8a756 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html @@ -0,0 +1,1409 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 118 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), Tgstation.Server.Host.Components.InstanceFactory.CreateInstance(), and Tgstation.Server.Host.Components.Instance.TimerLoop().

+
119  {
120  this.repository = repository ?? throw new ArgumentNullException(nameof(repository));
121  this.ioMananger = ioMananger ?? throw new ArgumentNullException(nameof(ioMananger));
122  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
123  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
124  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
125  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
126  IsGitHubRepository = Origin.Contains(GitHubUrl, StringComparison.InvariantCultureIgnoreCase);
127  if (IsGitHubRepository)
128  {
129  GetRepositoryOwnerName(Origin, out var owner, out var name);
130  GitHubOwner = owner;
131  GitHubRepoName = name;
132  }
133  }
+
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:87
+ + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 193 of file Repository.cs.

+ +

References Tgstation.Server.Api.Models.TestMergeParameters.Comment, Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler(), Tgstation.Server.Api.Models.TestMergeParameters.Number, and Tgstation.Server.Api.Models.TestMergeParameters.PullRequestRevision.

+
194  {
195  if (testMergeParameters == null)
196  throw new ArgumentNullException(nameof(testMergeParameters));
197  if (committerName == null)
198  throw new ArgumentNullException(nameof(committerName));
199  if (committerEmail == null)
200  throw new ArgumentNullException(nameof(committerEmail));
201  if (progressReporter == null)
202  throw new ArgumentNullException(nameof(progressReporter));
203 
204  logger.LogDebug("Begin AddTestMerge: #{0} at {1} ({4}) by <{2} ({3})>", testMergeParameters.Number, testMergeParameters.PullRequestRevision?.Substring(0, 7), committerName, committerEmail, testMergeParameters.Comment);
205 
206  if (!IsGitHubRepository)
207  throw new InvalidOperationException("Test merging is only available on GitHub hosted origin repositories!");
208 
209  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);
210 
211  var prBranchName = String.Format(CultureInfo.InvariantCulture, "pr-{0}", testMergeParameters.Number);
212  var localBranchName = String.Format(CultureInfo.InvariantCulture, "pull/{0}/headrefs/heads/{1}", testMergeParameters.Number, prBranchName);
213 
214  var refSpec = String.Format(CultureInfo.InvariantCulture, "pull/{0}/head:{1}", testMergeParameters.Number, prBranchName);
215  var refSpecList = new List<string> { refSpec };
216  var logMessage = String.Format(CultureInfo.InvariantCulture, "Merge remote pull request #{0}", testMergeParameters.Number);
217 
218  var originalCommit = repository.Head;
219 
220  MergeResult result = null;
221 
222  var sig = new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now);
223  await Task.Factory.StartNew(() =>
224  {
225  try
226  {
227  try
228  {
229  logger.LogTrace("Fetching refspec {0}...", refSpec);
230 
231  var remote = repository.Network.Remotes.First();
232  progressReporter(0);
233  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, refSpecList, new FetchOptions
234  {
235  Prune = true,
236  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
237  OnTransferProgress = (a) =>
238  {
239  var percentage = 50 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
240  progressReporter((int)percentage);
241  return !cancellationToken.IsCancellationRequested;
242  },
243  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
244  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
245  }, logMessage);
246  }
247  catch (UserCancelledException) { }
248 
249  cancellationToken.ThrowIfCancellationRequested();
250 
251  repository.RemoveUntrackedFiles();
252 
253  cancellationToken.ThrowIfCancellationRequested();
254 
255  testMergeParameters.PullRequestRevision = repository.Lookup(testMergeParameters.PullRequestRevision ?? localBranchName).Sha;
256 
257  cancellationToken.ThrowIfCancellationRequested();
258 
259  logger.LogTrace("Merging {0} into {1}...", testMergeParameters.PullRequestRevision.Substring(0, 7), Reference);
260 
261  result = repository.Merge(testMergeParameters.PullRequestRevision, sig, new MergeOptions
262  {
263  CommitOnSuccess = commitMessage == null,
264  FailOnConflict = true,
265  FastForwardStrategy = FastForwardStrategy.NoFastForward,
266  SkipReuc = true,
267  OnCheckoutProgress = (a, completedSteps, totalSteps) => progressReporter(50 + ((int)((((float)completedSteps) / totalSteps) * 50)))
268  });
269  }
270  finally
271  {
272  repository.Branches.Remove(localBranchName);
273  }
274 
275  cancellationToken.ThrowIfCancellationRequested();
276 
277  if (result.Status == MergeStatus.Conflicts)
278  {
279  var revertTo = originalCommit.CanonicalName ?? originalCommit.Tip.Sha;
280  logger.LogDebug("Merge conflict, aborting and reverting to {0}", revertTo);
281  RawCheckout(revertTo, progressReporter, cancellationToken);
282  cancellationToken.ThrowIfCancellationRequested();
283  }
284 
285  repository.RemoveUntrackedFiles();
286  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
287 
288  if (result.Status == MergeStatus.Conflicts)
289  {
290  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { originalCommit.Tip.Sha, testMergeParameters.PullRequestRevision, originalCommit.FriendlyName ?? UnknownReference, prBranchName }, cancellationToken).ConfigureAwait(false);
291  return null;
292  }
293 
294  if (commitMessage != null && result.Status != MergeStatus.UpToDate)
295  {
296  logger.LogTrace("Committing merge: \"{0}\"...", commitMessage);
297  await Task.Factory.StartNew(() => repository.Commit(commitMessage, sig, sig, new CommitOptions
298  {
299  PrettifyMessage = true
300  }), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
301  }
302 
303  await eventConsumer.HandleEvent(EventType.RepoMergePullRequest, new List<string> { testMergeParameters.Number.ToString(), testMergeParameters.PullRequestRevision, testMergeParameters.Comment }, cancellationToken).ConfigureAwait(false);
304 
305  return result.Status != MergeStatus.NonFastForward;
306  }
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
+ +
int Number
The number of the pull request
+
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
+ +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 309 of file Repository.cs.

+
310  {
311  if (committish == null)
312  throw new ArgumentNullException(nameof(committish));
313  if (progressReporter == null)
314  throw new ArgumentNullException(nameof(progressReporter));
315  logger.LogDebug("Checkout object: {0}...", committish);
316  await eventConsumer.HandleEvent(EventType.RepoCheckout, new List<string> { committish }, cancellationToken).ConfigureAwait(false);
317  await Task.Factory.StartNew(() =>
318  {
319  repository.RemoveUntrackedFiles();
320  RawCheckout(committish, progressReporter, cancellationToken);
321  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
322  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 434 of file Repository.cs.

+
435  {
436  if (path == null)
437  throw new ArgumentNullException(nameof(path));
438  logger.LogTrace("Copying to {0}...", path);
439  await ioMananger.CopyDirectory(".", path, new List<string> { ".git" }, cancellationToken).ConfigureAwait(false);
440  }
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
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Repository.Repository.Dispose ()
+
+ +

+ +

Definition at line 136 of file Repository.cs.

+ +

References Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler().

+
137  {
138  logger.LogTrace("Disposing...");
139  repository.Dispose();
140  onDispose.Invoke();
141  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 325 of file Repository.cs.

+ +

References Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler().

+
326  {
327  if (progressReporter == null)
328  throw new ArgumentNullException(nameof(progressReporter));
329  logger.LogDebug("Fetch origin...");
330  await eventConsumer.HandleEvent(EventType.RepoFetch, Array.Empty<string>(), cancellationToken).ConfigureAwait(false);
331  await Task.Factory.StartNew(() =>
332  {
333  var remote = repository.Network.Remotes.First();
334  try
335  {
336  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, remote.FetchRefSpecs.Select(x => x.Specification), new FetchOptions
337  {
338  Prune = true,
339  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
340  OnTransferProgress = (a) =>
341  {
342  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
343  progressReporter((int)percentage);
344  return !cancellationToken.IsCancellationRequested;
345  },
346  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
347  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
348  }, "Fetch origin commits");
349  }
350  catch (UserCancelledException)
351  {
352  cancellationToken.ThrowIfCancellationRequested();
353  }
354  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
355  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Components.Repository.Repository.GetRepositoryOwnerName (string remote,
out string owner,
out string name 
)
+
+private
+
+ +

Definition at line 87 of file Repository.cs.

+
88  {
89  //Assume standard gh format: [(git)|(https)]://github.com/owner/repo(.git)[0-1]
90  //Yes use .git twice in case it was weird
91  var toRemove = new string[] { ".git", "/", ".git" };
92  foreach (string item in toRemove)
93  if (remote.EndsWith(item, StringComparison.OrdinalIgnoreCase))
94  remote = remote.Substring(0, remote.LastIndexOf(item, StringComparison.OrdinalIgnoreCase));
95  var splits = remote.Split('/');
96  name = splits[splits.Length - 1];
97  owner = splits[splits.Length - 2].Split('.')[0];
98 
99  logger.LogTrace("GetRepositoryOwnerName({0}) => {1} / {2}", remote, owner, name);
100  }
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 443 of file Repository.cs.

+
444  {
445  if (progressReporter == null)
446  throw new ArgumentNullException(nameof(progressReporter));
447 
448  MergeResult result = null;
449  Branch trackedBranch = null;
450 
451  var oldHead = repository.Head;
452  var oldTip = oldHead.Tip;
453 
454  await Task.Factory.StartNew(() =>
455  {
456  if (!Tracking)
457  throw new JobException("Cannot reset to origin while not on a tracked reference!");
458 
459  repository.RemoveUntrackedFiles();
460 
461  cancellationToken.ThrowIfCancellationRequested();
462 
463  trackedBranch = repository.Head.TrackedBranch;
464  logger.LogDebug("Merge origin/{2}: <{0} ({1})>", committerName, committerEmail, trackedBranch.FriendlyName);
465  result = repository.Merge(trackedBranch, new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now), new MergeOptions
466  {
467  CommitOnSuccess = true,
468  FailOnConflict = true,
469  FastForwardStrategy = FastForwardStrategy.Default,
470  SkipReuc = true,
471  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
472  });
473 
474  cancellationToken.ThrowIfCancellationRequested();
475 
476  if (result.Status == MergeStatus.Conflicts)
477  {
478  logger.LogDebug("Merge conflict, aborting and reverting to {0}", oldHead.FriendlyName);
479  repository.Reset(ResetMode.Hard, oldTip, new CheckoutOptions
480  {
481  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
482  });
483  cancellationToken.ThrowIfCancellationRequested();
484  }
485 
486  repository.RemoveUntrackedFiles();
487  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
488 
489  if (result.Status == MergeStatus.Conflicts)
490  {
491  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { oldTip.Sha, trackedBranch.Tip.Sha, oldHead.FriendlyName ?? UnknownReference, trackedBranch.FriendlyName }, cancellationToken).ConfigureAwait(false);
492  return null;
493  }
494 
495  return result.Status == MergeStatus.FastForward;
496  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 396 of file Repository.cs.

+
397  {
398  if (progressReporter == null)
399  throw new ArgumentNullException(nameof(progressReporter));
400  if (!Tracking)
401  throw new JobException("Cannot reset to origin while not on a tracked reference!");
402  logger.LogTrace("Reset to origin...");
403  var trackedBranch = repository.Head.TrackedBranch;
404  await eventConsumer.HandleEvent(EventType.RepoResetOrigin, new List<string> { trackedBranch.FriendlyName, trackedBranch.Tip.Sha }, cancellationToken).ConfigureAwait(false);
405  await ResetToSha(trackedBranch.Tip.Sha, progressReporter, cancellationToken).ConfigureAwait(false);
406  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 499 of file Repository.cs.

+
500  {
501  if (committerName == null)
502  throw new ArgumentNullException(nameof(committerName));
503  if (committerEmail == null)
504  throw new ArgumentNullException(nameof(committerEmail));
505  if (progressReporter == null)
506  throw new ArgumentNullException(nameof(progressReporter));
507 
508  if (username == null && password == null)
509  {
510  logger.LogTrace("Not synchronizing due to lack of credentials!");
511  return false;
512  }
513  logger.LogTrace("Begin Synchronize...");
514 
515  if (username == null)
516  throw new ArgumentNullException(nameof(username));
517  if (password == null)
518  throw new ArgumentNullException(nameof(password));
519 
520  var startHead = Head;
521 
522  logger.LogTrace("Configuring <{0} ({1})> as author/committer", committerName, committerEmail);
523  await Task.Factory.StartNew(() =>
524  {
525  repository.Config.Set("user.name", committerName);
526  cancellationToken.ThrowIfCancellationRequested();
527  repository.Config.Set("user.email", committerEmail);
528  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
529 
530  cancellationToken.ThrowIfCancellationRequested();
531  try
532  {
533  if (!await eventConsumer.HandleEvent(EventType.RepoPreSynchronize, new List<string> { ioMananger.ResolvePath(".") }, cancellationToken).ConfigureAwait(false))
534  {
535  logger.LogDebug("Aborted synchronize due to event handler response!");
536  return false;
537  }
538  }
539  finally
540  {
541  logger.LogTrace("Resetting and cleaning untracked files...");
542  await Task.Factory.StartNew(() =>
543  {
544  repository.RemoveUntrackedFiles();
545  cancellationToken.ThrowIfCancellationRequested();
546  repository.Reset(ResetMode.Hard, repository.Head.Tip, new CheckoutOptions
547  {
548  OnCheckoutProgress = CheckoutProgressHandler(progress => progressReporter(progress / 10))
549  });
550  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
551  }
552 
553  void FinalReporter(int progress) => progressReporter((int)(((float)progress) / 100 * 90));
554 
555  if (!synchronizeTrackedBranch)
556  {
557  await PushHeadToTemporaryBranch(username, password, FinalReporter, cancellationToken).ConfigureAwait(false);
558  return false;
559  }
560 
561  var sameHead = Head == startHead;
562  if (sameHead || !Tracking)
563  {
564  logger.LogTrace("Aborted synchronize due to {0}!", sameHead ? "lack of changes" : "not being on tracked reference");
565  return false;
566  }
567 
568  logger.LogInformation("Synchronizing with origin...");
569 
570  return await Task.Factory.StartNew(() =>
571  {
572  var remote = repository.Network.Remotes.First();
573  try
574  {
575  repository.Network.Push(repository.Head, GeneratePushOptions(FinalReporter, username, password, cancellationToken));
576  return true;
577  }
578  catch (NonFastForwardException)
579  {
580  logger.LogInformation("Synchronize aborted, non-fast forward!");
581  return false;
582  }
583  catch (UserCancelledException e)
584  {
585  cancellationToken.ThrowIfCancellationRequested();
586  throw new InvalidOperationException("Caught UserCancelledException without cancellationToken triggering", e);
587  }
588  catch (LibGit2SharpException e)
589  {
590  logger.LogWarning("Unable to make synchronization push! Exception: {0}", e);
591  return false;
592  }
593  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
594  }
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

+ +
+
+ + + + + +
+ + + + +
readonly ICredentialsProvider Tgstation.Server.Host.Components.Repository.Repository.credentialsProvider
+
+private
+
+ +

The ICredentialsProvider for the Repository

+ +

Definition at line 75 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Repository.Repository.eventConsumer
+
+private
+
+ +

The IEventConsumer for the Repository

+ +

Definition at line 70 of file Repository.cs.

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Repository.Repository.GitHubUrl = "://github.com/"
+
+ +

Indication of a GitHub repository

+ +

Definition at line 22 of file Repository.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.Head => repository.Head.Tip.Sha
+
+ +

+ +

Definition at line 49 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Repository.Repository.ioMananger
+
+private
+
+ +

The IIOManager for the Repository

+ +

Definition at line 65 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Repository> Tgstation.Server.Host.Components.Repository.Repository.logger
+
+private
+
+ +

The ILogger for the Repository

+ +

Definition at line 80 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Action Tgstation.Server.Host.Components.Repository.Repository.onDispose
+
+private
+
+ +

Action to be taken when Dispose is called

+ +

Definition at line 85 of file Repository.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.Origin => repository.Network.Remotes.First().Url
+
+ +

+ +

Definition at line 55 of file Repository.cs.

+ +
+
+ +
+
+ + + + +
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.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.Reference => repository.Head.FriendlyName
+
+ +

+ +

Definition at line 52 of file Repository.cs.

+ +
+
+ +
+
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly LibGit2Sharp.IRepository Tgstation.Server.Host.Components.Repository.Repository.repository
+
+private
+
+ +

The LibGit2Sharp.IRepository for the Repository

+ +

Definition at line 60 of file Repository.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Repository.Repository.Tracking => Reference != null && repository.Head.IsTracking
+
+ +

+ +

Definition at line 46 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Repository.Repository.UnknownReference = "<UNKNOWN>"
+
+private
+
+ +

Definition at line 34 of file Repository.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.GitHubOwner
+
+get
+
+ +

+ +

Definition at line 40 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.GitHubRepoName
+
+get
+
+ +

+ +

Definition at line 43 of file Repository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.Repository.IsGitHubRepository
+
+get
+
+ +

+ +

Definition at line 37 of file Repository.cs.

+ +
+
+
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..e9b32fc036 --- /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,631 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 IEventConsumer eventConsumer
The IEventConsumer for the RepositoryManager
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler(), and Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
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  try
99  {
100  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
101  {
102  logger.LogTrace("Semaphore acquired");
103  if (!await ioManager.DirectoryExists(".", cancellationToken).ConfigureAwait(false))
104  try
105  {
106  await Task.Factory.StartNew(() =>
107  {
108  string path = null;
109  try
110  {
111  path = LibGit2Sharp.Repository.Clone(url.ToString(), ioManager.ResolvePath("."), new CloneOptions
112  {
113  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
114  OnTransferProgress = (a) =>
115  {
116  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
117  progressReporter((int)percentage);
118  return !cancellationToken.IsCancellationRequested;
119  },
120  RecurseSubmodules = true,
121  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
122  RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
123  BranchName = initialBranch,
124  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
125  });
126  }
127  catch (UserCancelledException) { }
128  cancellationToken.ThrowIfCancellationRequested();
129  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
130  }
131  catch
132  {
133  try
134  {
135  logger.LogTrace("Deleting partially cloned repository...");
136  await ioManager.DeleteDirectory(".", default).ConfigureAwait(false);
137  }
138  catch (Exception e)
139  {
140  logger.LogDebug("Error deleting partially cloned repository! Exception: {0}", e);
141  }
142  throw;
143  }
144  else
145  {
146  logger.LogDebug("Repository exists, clone aborted!");
147  return null;
148  }
149  }
150  logger.LogInformation("Clone complete!");
151  }
152  finally
153  {
154  CloneInProgress = false;
155  }
156  return await LoadRepository(cancellationToken).ConfigureAwait(false);
157  }
+
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
+ +
+
+
+ +
+
+ + + + + + + + +
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 199 of file RepositoryManager.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
200  {
201  logger.LogInformation("Deleting repository...");
202  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
203  {
204  logger.LogTrace("Semaphore acquired, deleting Repository directory...");
205  await ioManager.DeleteDirectory(".", cancellationToken).ConfigureAwait(false);
206  }
207  }
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
+ +
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Repository.RepositoryManager.Dispose ()
+
+ +

+ +

Definition at line 77 of file RepositoryManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.Dispose().

+
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
+
+
+
+ +
+
+ + + + + + + + +
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 160 of file RepositoryManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Components.Instance.TimerLoop().

+
161  {
162  logger.LogTrace("Begin LoadRepository...");
163  lock (this)
164  if (CloneInProgress)
165  throw new InvalidOperationException("The repository is being cloned!");
166  await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
167  LibGit2Sharp.Repository repo = null;
168  await Task.Factory.StartNew(() =>
169  {
170  try
171  {
172  logger.LogTrace("Creating LibGit2Sharp.Repository...");
173  repo = new LibGit2Sharp.Repository(ioManager.ResolvePath("."));
174  }
175  catch (RepositoryNotFoundException e)
176  {
177  logger.LogDebug("Repository not found!");
178  logger.LogTrace("Exception: {0}", e);
179  }
180  catch
181  {
182  semaphore.Release();
183  throw;
184  }
185  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
186  if (repo == null)
187  {
188  semaphore.Release();
189  return null;
190  }
192  {
193  logger.LogTrace("Releasing semaphore due to Repository disposal...");
194  semaphore.Release();
195  });
196  }
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly ICredentialsProvider Tgstation.Server.Host.Components.Repository.RepositoryManager.credentialsProvider
+
+private
+
+ +

The ICredentialsProvider for the RepositoryManager

+ +

Definition at line 34 of file RepositoryManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Repository.RepositoryManager.eventConsumer
+
+private
+
+ +

The IEventConsumer for the RepositoryManager

+ +

Definition at line 29 of file RepositoryManager.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Repository.RepositoryManager.InUse => semaphore.CurrentCount == 0
+
+ +

+ +

Definition at line 16 of file RepositoryManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Repository.RepositoryManager.ioManager
+
+private
+
+ +

The IIOManager for the RepositoryManager

+ +

Definition at line 24 of file RepositoryManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<RepositoryManager> Tgstation.Server.Host.Components.Repository.RepositoryManager.logger
+
+private
+
+ +

The ILogger for the RepositoryManager

+ +

Definition at line 44 of file RepositoryManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Repository> Tgstation.Server.Host.Components.Repository.RepositoryManager.repositoryLogger
+
+private
+
+ +

The ILogger created Repositorys

+ +

Definition at line 39 of file RepositoryManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly RepositorySettings Tgstation.Server.Host.Components.Repository.RepositoryManager.repositorySettings
+
+private
+
+ +

The RepositorySettings for the RepositoryManager

+ +

Definition at line 49 of file RepositoryManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore
+
+private
+
+ +

Used for controlling single access to the IRepository

+ +

Definition at line 54 of file RepositoryManager.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneInProgress
+
+getprivate set
+
+ +

+ +

Definition at line 19 of file RepositoryManager.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_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..29a4326c72 --- /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,139 @@ + + + + + + +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..a122272996 --- /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,1226 @@ + + + + + + +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 20 of file Configuration.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 91 of file Configuration.cs.

+
92  {
93  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
94  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
95  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
96  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
97  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
98  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
99  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
100 
101  semaphore = new SemaphoreSlim(1);
102  }
readonly ILogger< Configuration > logger
The ILogger for Configuration
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 132 of file Configuration.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
133  {
134 
135  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
136  {
137  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
138 
139  //just assume no other fs race conditions here
140  var dmeExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, dmeFile), cancellationToken);
143  var copyTask = ioManager.CopyDirectory(CodeModificationsSubdirectory, destination, null, cancellationToken);
144 
145  await Task.WhenAll(dmeExistsTask, headFileExistsTask, tailFileExistsTask, copyTask).ConfigureAwait(false);
146 
147  if (!dmeExistsTask.Result && !headFileExistsTask.Result && !tailFileExistsTask.Result)
148  return null;
149 
150  if (dmeExistsTask.Result)
151  return new ServerSideModifications(null, null, true);
152 
153  if (!headFileExistsTask.Result && !tailFileExistsTask.Result)
154  return null;
155 
156  string IncludeLine(string filePath) => String.Format(CultureInfo.InvariantCulture, "#include \"{0}\"", filePath);
157 
158  return new ServerSideModifications(headFileExistsTask.Result ? IncludeLine(CodeModificationsHeadFile) : null, tailFileExistsTask.Result ? IncludeLine(CodeModificationsTailFile) : null, false);
159  }
160  }
+
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
+ + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 414 of file Configuration.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated().

+
415  {
416  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
417  var path = ValidateConfigRelativePath(configurationRelativePath);
418 
419  bool? result = null;
420  void DoCreate() => result = synchronousIOManager.CreateDirectory(path, cancellationToken);
421 
422  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
423  if (systemIdentity == null)
424  await Task.Factory.StartNew(DoCreate, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
425  else
426  await systemIdentity.RunImpersonated(DoCreate, cancellationToken).ConfigureAwait(false);
427 
428  return result.Value;
429  }
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
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated().

+
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  return result;
481  }
bool DeleteDirectory(string path)
Deletes a directory at path if it&#39;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
+ +
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.StaticFiles.Configuration.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 118 of file Configuration.cs.

+
119  {
120  async Task ValidateStaticFolder()
121  {
122  await ioManager.CreateDirectory(GameStaticFilesSubdirectory, cancellationToken).ConfigureAwait(false);
123  var staticIgnorePath = StaticIgnorePath();
124  if(!await ioManager.FileExists(staticIgnorePath, cancellationToken).ConfigureAwait(false))
125  await ioManager.WriteAllBytes(staticIgnorePath, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
126  }
127 
128  await Task.WhenAll(ioManager.CreateDirectory(CodeModificationsSubdirectory, cancellationToken), ioManager.CreateDirectory(EventScriptsSubdirectory, cancellationToken), ValidateStaticFolder()).ConfigureAwait(false);
129  }
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
+ + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 438 of file Configuration.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
439  {
440  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
441 
442  if (!EventTypeScriptFileNameMap.TryGetValue(eventType, out var scriptName))
443  return true;
444 
445  //always execute in serial
446  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
447  {
448  var files = await ioManager.GetFilesWithExtension(EventScriptsSubdirectory, platformIdentifier.ScriptFileExtension, cancellationToken).ConfigureAwait(false);
449  var resolvedScriptsDir = ioManager.ResolvePath(EventScriptsSubdirectory);
450 
451  foreach (var I in files.Select(x => ioManager.GetFileName(x)).Where(x => x.StartsWith(scriptName, StringComparison.Ordinal)))
452  using (var script = processExecutor.LaunchProcess(ioManager.ConcatPath(resolvedScriptsDir, I), resolvedScriptsDir, String.Join(' ', parameters), noShellExecute: true))
453  using (cancellationToken.Register(() => script.Terminate()))
454  {
455  var exitCode = await script.Lifetime.ConfigureAwait(false);
456  cancellationToken.ThrowIfCancellationRequested();
457  if (exitCode != 0)
458  return false;
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
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 177 of file Configuration.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated().

+
178  {
179  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
180  var path = ValidateConfigRelativePath(configurationRelativePath);
181 
182  if (configurationRelativePath == null)
183  configurationRelativePath = "/";
184 
185  List<ConfigurationFile> result = new List<ConfigurationFile>();
186 
187  void ListImpl()
188  {
189  var enumerator = synchronousIOManager.GetDirectories(path, cancellationToken);
190  try
191  {
192  result.AddRange(enumerator.Select(x => new ConfigurationFile
193  {
194  IsDirectory = true,
195  Path = ioManager.ConcatPath(configurationRelativePath, x),
196  }));
197  }
198  catch (IOException e)
199  {
200  logger.LogDebug("IOException while writing {0}: {1}", path, e);
201  result = null;
202  return;
203  }
204  enumerator = synchronousIOManager.GetFiles(path, cancellationToken);
205  result.AddRange(enumerator.Select(x => new ConfigurationFile
206  {
207  IsDirectory = false,
208  Path = ioManager.ConcatPath(configurationRelativePath, x),
209  }));
210  }
211 
212  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
213  if (systemIdentity == null)
214  ListImpl();
215  else
216  await systemIdentity.RunImpersonated(ListImpl, cancellationToken).ConfigureAwait(false);
217 
218  return result;
219  }
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
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 222 of file Configuration.cs.

+ +

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().

+
223  {
224  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
225  var path = ValidateConfigRelativePath(configurationRelativePath);
226 
227  ConfigurationFile result = null;
228 
229  void ReadImpl()
230  {
231  lock (this)
232  try
233  {
234  var content = synchronousIOManager.ReadFile(path);
235  string sha1String;
236 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
237  using (var sha1 = new SHA1Managed())
238 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
239  sha1String = String.Join("", sha1.ComputeHash(content).Select(b => b.ToString("x2", CultureInfo.InvariantCulture)));
240  result = new ConfigurationFile
241  {
242  Content = content,
243  IsDirectory = false,
244  LastReadHash = sha1String,
245  AccessDenied = false,
246  Path = configurationRelativePath
247  };
248  }
249  catch (UnauthorizedAccessException)
250  {
251  //this happens on windows, dunno about linux
252  bool isDirectory;
253  try
254  {
255  isDirectory = synchronousIOManager.IsDirectory(path);
256  }
257  catch
258  {
259  isDirectory = false;
260  }
261 
262  result = new ConfigurationFile
263  {
264  Path = configurationRelativePath
265  };
266  if (!isDirectory)
267  result.AccessDenied = true;
268  else
269  result.IsDirectory = true;
270  }
271  }
272 
273  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
274  if (systemIdentity == null)
275  await Task.Factory.StartNew(ReadImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
276  else
277  await systemIdentity.RunImpersonated(ReadImpl, cancellationToken).ConfigureAwait(false);
278 
279  return result;
280  }
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
+ +
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.StaticFiles.Configuration.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
string Tgstation.Server.Host.Components.StaticFiles.Configuration.StaticIgnorePath ()
+
+private
+
+ +

Get the proper path to StaticIgnoreFile

+
Returns
The ioManager relative path to StaticIgnoreFile
+ +
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.StaticFiles.Configuration.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 283 of file Configuration.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
284  {
285  async Task<IReadOnlyList<string>> GetIgnoreFiles()
286  {
287  var ignoreFileBytes = await ioManager.ReadAllBytes(StaticIgnorePath(), cancellationToken).ConfigureAwait(false);
288  var ignoreFileText = Encoding.UTF8.GetString(ignoreFileBytes);
289 
290  var results = new List<string> { StaticIgnoreFile };
291 
292  //we don't want to lose trailing whitespace on linux
293  using (var reader = new StringReader(ignoreFileText))
294  {
295  cancellationToken.ThrowIfCancellationRequested();
296  var line = await reader.ReadLineAsync().ConfigureAwait(false);
297  if (!String.IsNullOrEmpty(line))
298  results.Add(line);
299  }
300 
301  return results;
302  };
303 
304  IReadOnlyList<string> ignoreFiles;
305 
306  async Task SymlinkBase(bool files)
307  {
308  Task<IReadOnlyList<string>> task;
309  if (files)
310  task = ioManager.GetFiles(GameStaticFilesSubdirectory, cancellationToken);
311  else
312  task = ioManager.GetDirectories(GameStaticFilesSubdirectory, cancellationToken);
313  var entries = await task.ConfigureAwait(false);
314 
315  await Task.WhenAll(entries.Select(async x =>
316  {
317  var fileName = ioManager.GetFileName(x);
318 
319  bool ignored;
320  if (platformIdentifier.IsWindows)
321  //need to normalize
322  ignored = ignoreFiles.Any(y => fileName.ToUpperInvariant() == y.ToUpperInvariant());
323  else
324  ignored = ignoreFiles.Any(y => fileName == y);
325 
326  if (ignored)
327  {
328  logger.LogTrace("Ignoring static file {0}...", fileName);
329  return;
330  }
331 
332  var destPath = ioManager.ConcatPath(destination, fileName);
333  logger.LogTrace("Symlinking {0} to {1}...", x, destPath);
334  var fileExistsTask = ioManager.FileExists(destPath, cancellationToken);
335  if (await ioManager.DirectoryExists(destPath, cancellationToken).ConfigureAwait(false))
336  await ioManager.DeleteDirectory(destPath, cancellationToken).ConfigureAwait(false);
337  var fileExists = await fileExistsTask.ConfigureAwait(false);
338  if (fileExists)
339  await ioManager.DeleteFile(destPath, cancellationToken).ConfigureAwait(false);
340  await symlinkFactory.CreateSymbolicLink(ioManager.ResolvePath(x), ioManager.ResolvePath(destPath), cancellationToken).ConfigureAwait(false);
341  })).ConfigureAwait(false);
342  }
343 
344  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
345  {
346  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
347  ignoreFiles = await GetIgnoreFiles().ConfigureAwait(false);
348  await Task.WhenAll(SymlinkBase(true), SymlinkBase(false)).ConfigureAwait(false);
349  }
350  }
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
string Tgstation.Server.Host.Components.StaticFiles.Configuration.ValidateConfigRelativePath (string configurationRelativePath)
+
+private
+
+ +

Definition at line 162 of file Configuration.cs.

+
163  {
164  var nullOrEmptyCheck = String.IsNullOrEmpty(configurationRelativePath);
165  if (nullOrEmptyCheck)
166  configurationRelativePath = ".";
167  if (configurationRelativePath[0] == Path.DirectorySeparatorChar || configurationRelativePath[0] == Path.AltDirectorySeparatorChar)
168  configurationRelativePath = '.' + configurationRelativePath;
169  var resolved = ioManager.ResolvePath(configurationRelativePath);
170  var local = !nullOrEmptyCheck ? ioManager.ResolvePath(".") : null;
171  if (!nullOrEmptyCheck && resolved.Length < local.Length) //.. fuccbois
172  throw new InvalidOperationException("Attempted to access file outside of configuration manager!");
173  return resolved;
174  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 353 of file Configuration.cs.

+ +

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().

+
354  {
355  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
356  var path = ValidateConfigRelativePath(configurationRelativePath);
357 
358  ConfigurationFile result = null;
359 
360  void WriteImpl()
361  {
362  lock (this)
363  try
364  {
365  var fileHash = previousHash;
366  var success = synchronousIOManager.WriteFileChecked(path, data, ref fileHash, cancellationToken);
367  if (!success)
368  return;
369  if (data != null)
371  result = new ConfigurationFile
372  {
373  Content = data,
374  IsDirectory = false,
375  LastReadHash = fileHash,
376  AccessDenied = false,
377  Path = configurationRelativePath
378  };
379  }
380  catch (UnauthorizedAccessException)
381  {
382  //this happens on windows, dunno about linux
383  bool isDirectory;
384  try
385  {
386  isDirectory = synchronousIOManager.IsDirectory(path);
387  }
388  catch
389  {
390  isDirectory = false;
391  }
392 
393  result = new ConfigurationFile
394  {
395  Path = configurationRelativePath
396  };
397  if (!isDirectory)
398  result.AccessDenied = true;
399  else
400  result.IsDirectory = true;
401  }
402  }
403 
404  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
405  if (systemIdentity == null)
406  await Task.Factory.StartNew(WriteImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
407  else
408  await systemIdentity.RunImpersonated(WriteImpl, cancellationToken).ConfigureAwait(false);
409 
410  return result;
411  }
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
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsHeadFile = "HeadInclude.dm"
+
+private
+
+ +

Definition at line 31 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsSubdirectory = "CodeModifications"
+
+private
+
+ +

Definition at line 22 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsTailFile = "TailInclude.dm"
+
+private
+
+ +

Definition at line 32 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.EventScriptsSubdirectory = "EventScripts"
+
+private
+
+ +

Definition at line 23 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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 34 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.GameStaticFilesSubdirectory = "GameStaticFiles"
+
+private
+
+ +

Definition at line 24 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager
+
+private
+
+ +

The IIOManager for Configuration

+ +

Definition at line 44 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Configuration> Tgstation.Server.Host.Components.StaticFiles.Configuration.logger
+
+private
+
+ +

The ILogger for Configuration

+ +

Definition at line 74 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Components.StaticFiles.Configuration.platformIdentifier
+
+private
+
+ +

The IPlatformIdentifier for Configuration

+ +

Definition at line 69 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPostWriteHandler Tgstation.Server.Host.Components.StaticFiles.Configuration.postWriteHandler
+
+private
+
+ +

The IPostWriteHandler for Configuration

+ +

Definition at line 64 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.StaticFiles.Configuration.processExecutor
+
+private
+
+ +

The IProcessExecutor for Configuration

+ +

Definition at line 59 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore
+
+private
+
+ +

The SemaphoreSlim for Configuration

+ +

Definition at line 79 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.StaticIgnoreFile = ".tgsignore"
+
+private
+
+ +

Name of the ignore file in GameStaticFilesSubdirectory

+ +

Definition at line 29 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISymlinkFactory Tgstation.Server.Host.Components.StaticFiles.Configuration.symlinkFactory
+
+private
+
+ +

The ISymlinkFactory for Configuration

+ +

Definition at line 54 of file Configuration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISynchronousIOManager Tgstation.Server.Host.Components.StaticFiles.Configuration.synchronousIOManager
+
+private
+
+ +

The ISynchronousIOManager for Configuration

+ +

Definition at line 49 of file Configuration.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_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..12bb65849d --- /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,113 @@ + + + + + + +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..4e7173358a --- /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,260 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.TotalDmeOverwrite
+
+get
+
+ +

If the target dme was completely overwitten

+ +

Definition at line 11 of file ServerSideModifications.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_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..e02c7cb7e1 --- /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,129 @@ + + + + + + +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..97362bee92 --- /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,672 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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  }
+ + + +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
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  Dmb.Dispose();
76  }
+
bool disposed
If the DeadSessionController was Disposed
+
+
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ResetRebootState ()
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ApiValidationStatus => throw new NotSupportedException()
+
+ +

+ +

Definition at line 22 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.disposed
+
+private
+
+ +

If the DeadSessionController was Disposed

+ +

Definition at line 49 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.IsPrimary => false
+
+ +

+ +

Definition at line 16 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + +
ushort Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Port => null
+
+ +

+ +

Definition at line 28 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + +
RebootState Tgstation.Server.Host.Components.Watchdog.DeadSessionController.RebootState => throw new NotSupportedException()
+
+ +

+ +

Definition at line 38 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.TerminationWasRequested => false
+
+ +

+ +

Definition at line 19 of file DeadSessionController.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ClosePortOnReboot
+
+getset
+
+ +

+ +

Definition at line 32 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dmb
+
+get
+
+ +

+ +

Definition at line 25 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task<LaunchResult> Tgstation.Server.Host.Components.Watchdog.DeadSessionController.LaunchResult
+
+get
+
+ +

+ +

Definition at line 13 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task<int> Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Lifetime
+
+get
+
+ +

+ +

Definition at line 44 of file DeadSessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.DeadSessionController.OnReboot
+
+get
+
+ +

+ +

Definition at line 41 of file DeadSessionController.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_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_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..c9f3212da7 --- /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,112 @@ + + + + + + +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..dc56af5541 --- /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,202 @@ + + + + + + +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 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

+ +
+
+ + + + + + + +
override string Tgstation.Server.Host.Components.Watchdog.LaunchResult.ToString ()
+
+ +

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Host.Components.Watchdog.LaunchResult.StartupTime
+
+getset
+
+ +

The time it took for System.Diagnostics.Process.WaitForInputIdle() to return. If the startup timed out

+ +

Definition at line 14 of file LaunchResult.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_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..18462e0a0d --- /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,114 @@ + + + + + + +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..d0a80fdc61 --- /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,269 @@ + + + + + + +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 Watchdog + 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 Watchdog.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 Watchdog

+ +

Definition at line 8 of file MonitorState.cs.

+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.MonitorState.ActiveServer
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.MonitorState.InactiveServer
+
+getset
+
+ +

The inactive ISessionController

+ +

Definition at line 35 of file MonitorState.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup().

+ +
+
+ +
+
+ + + + + +
+ + + + +
MonitorAction Tgstation.Server.Host.Components.Watchdog.MonitorState.NextAction
+
+getset
+
+ +

The next MonitorAction to take in Watchdog.MonitorLifetimes(System.Threading.CancellationToken)

+ +

Definition at line 23 of file MonitorState.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup(), and Tgstation.Server.Host.Components.Watchdog.Watchdog.MonitorLifetimes().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.MonitorState.RebootingInactiveServer
+
+getset
+
+ +

If the inactive server is being rebooted

+ +

Definition at line 13 of file MonitorState.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.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..81b2fad4ef --- /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,110 @@ + + + + + + +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..34d2c84a04 --- /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,157 @@ + + + + + + +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 7 of file PosixNetworkPromptReaper.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
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 10 of file PosixNetworkPromptReaper.cs.

+
10 { }
+
+
+
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..add4df45de --- /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,278 @@ + + + + + + +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

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation ()
+
+ +

Construct a ReattachInformation

+ +

Definition at line 19 of file ReattachInformation.cs.

+
19 { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb
+
+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_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..f20c824bc5 --- /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,149 @@ + + + + + + +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..a341803980 --- /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,1457 @@ + + + + + + +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 ()
 Finalize the SessionController More...
 
void Dispose (bool disposing)
 
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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 182 of file SessionController.cs.

+ +

References Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.Active, Tgstation.Server.Host.Core.IProcessBase.Lifetime, Tgstation.Server.Host.Components.Interop.ICommContext.RegisterHandler(), and Tgstation.Server.Host.Core.IProcess.Startup.

+
183  {
184  this.chatJsonTrackingContext = chatJsonTrackingContext; //null valid
185  this.reattachInformation = reattachInformation ?? throw new ArgumentNullException(nameof(reattachInformation));
186  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
187  this.process = process ?? throw new ArgumentNullException(nameof(process));
188  this.byondLock = byondLock ?? throw new ArgumentNullException(nameof(byondLock));
189  this.interopContext = interopContext ?? throw new ArgumentNullException(nameof(interopContext));
190  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
191  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
192 
194 
195  interopContext.RegisterHandler(this);
196 
197  portClosedForReboot = false;
198  disposed = false;
199  apiValidationStatus = ApiValidationStatus.NeverValidated;
200  released = false;
201 
202  rebootTcs = new TaskCompletionSource<object>();
203 
204  process.Lifetime.ContinueWith(x => chatJsonTrackingContext.Active = false, TaskScheduler.Current);
205 
206  async Task<LaunchResult> GetLaunchResult()
207  {
208  var startTime = DateTimeOffset.Now;
209  Task toAwait = process.Startup;
210 
211  if (startupTimeout.HasValue)
212  toAwait = Task.WhenAny(process.Startup, Task.Delay(startTime.AddSeconds(startupTimeout.Value) - startTime));
213 
214  await toAwait.ConfigureAwait(false);
215 
216  var result = new LaunchResult
217  {
218  ExitCode = process.Lifetime.IsCompleted ? (int?)await process.Lifetime.ConfigureAwait(false) : null,
219  StartupTime = process.Startup.IsCompleted ? (TimeSpan?)(DateTimeOffset.Now - startTime) : null
220  };
221  return result;
222  };
223  LaunchResult = GetLaunchResult();
224  }
bool disposed
If the SessionController has been disposed
+
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 IJsonTrackingContext chatJsonTrackingContext
The IJsonTrackingContext for the SessionController
+
bool Active
If the IJsonTrackingContext should be used for GetCustomCommands(CancellationToken) ...
+
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 DreamDaemonSecurity launchSecurityLevel
The DreamDaemonSecurity level the process was launched with
+ +
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+
TaskCompletionSource< object > rebootTcs
The TaskCompletionSource<TResult> that completes when DD tells us about a reboot
+
ApiValidationStatus apiValidationStatus
The ApiValidationStatus for the SessionController
+
bool portClosedForReboot
If we know DreamDaemon currently has it&#39;s port closed
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
bool released
If process should be kept alive instead
+
+
+
+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Components.Watchdog.SessionController.~SessionController ()
+
+private
+
+ +

Finalize the SessionController

+

The finalizer dispose pattern is necessary so we don't accidentally leak the executable

+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.CheckDisposed ()
+
+private
+
+ +

Throws an ObjectDisposedException if Dispose(bool) has been called

+ +

Definition at line 406 of file SessionController.cs.

+
407  {
408  if (disposed)
409  throw new ObjectDisposedException(nameof(SessionController));
410  }
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
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose ()
+
+ +

+ +

Definition at line 235 of file SessionController.cs.

+
236  {
237  Dispose(true);
238  GC.SuppressFinalize(this);
239  }
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose (bool disposing)
+
+private
+
+ +

+ +

Definition at line 242 of file SessionController.cs.

+
243  {
244  lock (this)
245  {
246  if (disposed)
247  return;
248  if (disposing)
249  {
250  if (!released)
251  {
252  process.Terminate();
253  byondLock.Dispose();
254  }
255  process.Dispose();
256  interopContext.Dispose();
257  Dmb?.Dispose(); //will be null when released
258  chatJsonTrackingContext.Dispose();
259  disposed = true;
260  }
261  else
262  {
263  if (logger != null)
264  logger.LogError("Being disposed via finalizer!");
265  if (!released)
266  if (process != null)
267  process.Terminate();
268  else if (logger != null)
269  logger.LogCritical("Unable to terminate active DreamDaemon session due to finalizer ordering!");
270  }
271  }
272  }
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
+
+
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 275 of file SessionController.cs.

+ +

References 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.Interop.CommCommand.Parameters, and Tgstation.Server.Host.Components.Interop.CommCommand.RawJson.

+
276  {
277  if (command == null)
278  throw new ArgumentNullException(nameof(command));
279 
280  var query = command.Parameters;
281 
282  object content;
283  Action postRespond = null;
284  ushort? overrideResponsePort = null;
285  if (query.TryGetValue(Constants.DMParameterCommand, out var method))
286  {
287  content = new object();
288  switch (method)
289  {
291  try
292  {
293  var message = JsonConvert.DeserializeObject<Response>(command.RawJson, new JsonSerializerSettings
294  {
295  ContractResolver = new CamelCasePropertyNamesContractResolver()
296  });
297  if (message.ChannelIds == null)
298  throw new InvalidOperationException("Missing ChannelIds field!");
299  if (message.Message == null)
300  throw new InvalidOperationException("Missing Message field!");
301  await chat.SendMessage(message.Message, message.ChannelIds, cancellationToken).ConfigureAwait(false);
302  }
303  catch (Exception e)
304  {
305  logger.LogDebug("Exception while decoding chat message! Exception: {0}", e);
306  goto default;
307  }
308  break;
310  //currently unused, maybe in the future
311  break;
314  process.Terminate();
315  return;
317  lock (this)
318  {
319  if (!query.TryGetValue(Constants.DMParameterData, out var stringPort) || !UInt16.TryParse(stringPort, out var currentPort))
320  {
322  logger.LogWarning("DreamDaemon sent new port command without providing it's own!");
323  content = new ErrorMessage { Message = "Missing stringified port as data parameter!" };
324  break;
325  }
326 
327  if (!nextPort.HasValue)
328  //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
329  reattachInformation.Port = currentPort;
330  else
331  {
332  //nextPort is ready, tell DD to switch to that
333  //if it fails it'll kill itself
334  content = new Dictionary<string, ushort> { { Constants.DMParameterData, nextPort.Value } };
336  overrideResponsePort = currentPort;
337  nextPort = null;
338 
339  //we'll also get here from SetPort so complete that task
340  var tmpTcs = portAssignmentTcs;
341  portAssignmentTcs = null;
342  if (tmpTcs != null)
343  postRespond = () => tmpTcs.SetResult(true);
344  }
345 
346  portClosedForReboot = false;
347  }
348  break;
350  if (!launchSecurityLevel.HasValue)
351  {
352  logger.LogWarning("DreamDaemon requested API validation but no intial security level was passed to the session controller!");
353  apiValidationStatus = ApiValidationStatus.UnaskedValidationRequest;
354  content = new ErrorMessage { Message = "Invalid API validation request!" };
355  break;
356  }
357  if (!query.TryGetValue(Constants.DMParameterData, out var stringMinimumSecurityLevel) || !Enum.TryParse<DreamDaemonSecurity>(stringMinimumSecurityLevel, out var minimumSecurityLevel))
358  apiValidationStatus = ApiValidationStatus.BadValidationRequest;
359  else
360  switch (minimumSecurityLevel)
361  {
362  case DreamDaemonSecurity.Safe:
364  break;
365  case DreamDaemonSecurity.Ultrasafe:
366  apiValidationStatus = ApiValidationStatus.RequiresUltrasafe;
367  break;
368  case DreamDaemonSecurity.Trusted:
369  apiValidationStatus = ApiValidationStatus.RequiresTrusted;
370  break;
371  default:
372  throw new InvalidOperationException("Enum.TryParse failed to validate the DreamDaemonSecurity range!");
373  }
374  break;
376  if (ClosePortOnReboot)
377  {
379  content = new Dictionary<string, int> { { Constants.DMParameterData, 0 } };
380  portClosedForReboot = true;
381  }
382  var oldTcs = rebootTcs;
383  rebootTcs = new TaskCompletionSource<object>();
384  postRespond = () => oldTcs.SetResult(null);
385  break;
386  default:
387  content = new ErrorMessage { Message = "Requested command not supported!" };
388  break;
389  }
390  }
391  else
392  content = new ErrorMessage { Message = "Missing command parameter!" };
393 
394  var json = JsonConvert.SerializeObject(content);
395  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);
396 
397  if (response != Constants.DMResponseSuccess)
398  logger.LogWarning("Received error response while responding to interop: {0}", response);
399 
400  postRespond?.Invoke();
401  }
+ +
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
IReadOnlyDictionary< string, string > Parameters
The dictionary of the CommCommand
Definition: CommCommand.cs:13
+ +
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
+
readonly DreamDaemonSecurity launchSecurityLevel
The DreamDaemonSecurity level the process was launched with
+ +
TaskCompletionSource< bool > portAssignmentTcs
The TaskCompletionSource<TResult> SetPort(ushort, CancellationToken) waits on when DreamDaemon curren...
+ + +
ushort Port
The port DreamDaemon was last listening on
+
void Terminate()
Terminates the process
+ +
ushort nextPort
The port to assign DreamDaemon when it queries for it
+
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+
TaskCompletionSource< object > rebootTcs
The TaskCompletionSource<TResult> that completes when DD tells us about a reboot
+ + +
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
+ + + +
ApiValidationStatus apiValidationStatus
The ApiValidationStatus for the SessionController
+ +
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
bool portClosedForReboot
If we know DreamDaemon currently has it&#39;s port closed
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
Represents a chat message requested by DD
Definition: Response.cs:8
+
+
+
+ +
+
+ + + + + + + +
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 416 of file SessionController.cs.

+
417  {
418  CheckDisposed();
419  //we still don't want to dispose the dmb yet, even though we're keeping it alive
420  var tmpProvider = reattachInformation.Dmb;
421  reattachInformation.Dmb = null;
422  released = true;
423  Dispose();
425  tmpProvider.KeepAlive();
426  reattachInformation.Dmb = tmpProvider;
427  return reattachInformation;
428  }
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
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.ResetRebootState ()
+
+ +

Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +

Definition at line 508 of file SessionController.cs.

+
509  {
510  CheckDisposed();
512  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand (string command,
CancellationToken cancellationToken 
)
+
+ +

Sends a command to DreamDaemon through /world/Topic()

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<string> Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand (string command,
ushort? overridePort,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Definition at line 433 of file SessionController.cs.

+ +

References Tgstation.Server.Host.Components.Interop.Constants.DMInteropAccessIdentifier, and Tgstation.Server.Host.Components.Interop.Constants.DMParameterCommand.

+
434  {
435  try
436  {
437  var commandString = String.Format(CultureInfo.InvariantCulture,
438  "?{0}={1}&{2}={3}",
442  //intentionally don't sanitize command, that's up to the caller
443  command);
444 
445  var targetPort = overridePort ?? reattachInformation.Port;
446  logger.LogTrace("Export to :{0}. Query: {1}", targetPort, commandString);
447 
448  return await byondTopicSender.SendTopic(
449  new IPEndPoint(IPAddress.Loopback, targetPort),
450  commandString,
451  cancellationToken).ConfigureAwait(false);
452  }
453  catch (OperationCanceledException)
454  {
455  throw;
456  }
457  catch (Exception e)
458  {
459  logger.LogInformation("Send command exception:{0}{1}", Environment.NewLine, e.Message);
460  return null;
461  }
462  }
+
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
+ + + +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
+
+
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 465 of file SessionController.cs.

+ +

References Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMResponseSuccess, and Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangePort.

+
466  {
467  CheckDisposed();
468 
469  if (port == 0)
470  throw new ArgumentOutOfRangeException(nameof(port), port, "port must not be zero!");
471 
472  async Task<bool> ImmediateTopicPortChange()
473  {
474  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);
475 
476  if (commandResult != Constants.DMResponseSuccess)
477  {
478  logger.LogWarning("Failed port change! DD says: {0}", commandResult);
479  return false;
480  }
481 
482  return true;
483  }
484 
485  lock (this)
487  {
488  if (portAssignmentTcs != null)
489  throw new InvalidOperationException("A port change operation is already in progress!");
490  nextPort = port;
491  portAssignmentTcs = new TaskCompletionSource<bool>();
492  return portAssignmentTcs.Task;
493  }
494  else
495  return ImmediateTopicPortChange();
496  }
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 nextPort
The port to assign DreamDaemon when it queries for it
+
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+ + + +
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
bool portClosedForReboot
If we know DreamDaemon currently has it&#39;s port closed
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 499 of file SessionController.cs.

+ +

References Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMResponseSuccess, and Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangeReboot.

+
500  {
501  if (RebootState == newRebootState)
502  return true;
503  reattachInformation.RebootState = newRebootState;
504  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;
505  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+ + + +
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+ + +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
RebootState RebootState
The current DreamDaemon reboot state
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
ApiValidationStatus Tgstation.Server.Host.Components.Watchdog.SessionController.apiValidationStatus
+
+private
+
+ +

The ApiValidationStatus for the SessionController

+ +

Definition at line 162 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondExecutableLock Tgstation.Server.Host.Components.Watchdog.SessionController.byondLock
+
+private
+
+ +

The IByondExecutableLock for the SessionController

+ +

Definition at line 113 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender
+
+private
+
+ +

The IByondTopicSender for the SessionController

+ +

Definition at line 98 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IChat Tgstation.Server.Host.Components.Watchdog.SessionController.chat
+
+private
+
+ +

The IChat for the SessionController

+ +

Definition at line 123 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJsonTrackingContext Tgstation.Server.Host.Components.Watchdog.SessionController.chatJsonTrackingContext
+
+private
+
+ +

The IJsonTrackingContext for the SessionController

+ +

Definition at line 118 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.disposed
+
+private
+
+ +

If the SessionController has been disposed

+ +

Definition at line 157 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICommContext Tgstation.Server.Host.Components.Watchdog.SessionController.interopContext
+
+private
+
+ +

The ICommContext for the SessionController

+ +

Definition at line 103 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly DreamDaemonSecurity Tgstation.Server.Host.Components.Watchdog.SessionController.launchSecurityLevel
+
+private
+
+ +

The DreamDaemonSecurity level the process was launched with

+ +

Definition at line 133 of file SessionController.cs.

+ +
+
+ +
+
+ + + + +
Task<int> Tgstation.Server.Host.Components.Watchdog.SessionController.Lifetime => process.Lifetime
+
+ +

+ +

Definition at line 85 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<SessionController> Tgstation.Server.Host.Components.Watchdog.SessionController.logger
+
+private
+
+ +

The ILogger for the SessionController

+ +

Definition at line 128 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Host.Components.Watchdog.SessionController.nextPort
+
+private
+
+ +

The port to assign DreamDaemon when it queries for it

+ +

Definition at line 142 of file SessionController.cs.

+ +
+
+ +
+
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.SessionController.OnReboot => rebootTcs.Task
+
+ +

+ +

Definition at line 88 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.portClosedForReboot
+
+private
+
+ +

If we know DreamDaemon currently has it's port closed

+ +

Definition at line 152 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProcess Tgstation.Server.Host.Components.Watchdog.SessionController.process
+
+private
+
+ +

The IProcess for the SessionController

+ +

Definition at line 108 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ReattachInformation Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation
+
+private
+
+ +

The up to date ReattachInformation

+ +

Definition at line 93 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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 147 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.released
+
+private
+
+ +

If process should be kept alive instead

+ +

Definition at line 167 of file SessionController.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ApiValidationStatus Tgstation.Server.Host.Components.Watchdog.SessionController.ApiValidationStatus
+
+get
+
+ +

+ +

Definition at line 34 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.ClosePortOnReboot
+
+getset
+
+ +

+ +

Definition at line 76 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Watchdog.SessionController.Dmb
+
+get
+
+ +

+ +

Definition at line 45 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.IsPrimary
+
+get
+
+ +

+ +

Definition at line 24 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task<LaunchResult> Tgstation.Server.Host.Components.Watchdog.SessionController.LaunchResult
+
+get
+
+ +

+ +

Definition at line 82 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Host.Components.Watchdog.SessionController.Port
+
+get
+
+ +

+ +

Definition at line 55 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
RebootState Tgstation.Server.Host.Components.Watchdog.SessionController.RebootState
+
+get
+
+ +

+ +

Definition at line 67 of file SessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.TerminationWasRequested
+
+getprivate set
+
+ +

+ +

Definition at line 79 of file SessionController.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_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..3c1fef60b6 --- /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,125 @@ + + + + + + +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..af232dfa5a --- /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,757 @@ + + + + + + +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 24 of file SessionControllerFactory.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 115 of file SessionControllerFactory.cs.

+
116  {
117  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
118  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
119  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
120  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
121  this.application = application ?? throw new ArgumentNullException(nameof(application));
122  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
123  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
124  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
125  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
126  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
127  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
128  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the SessionControllerFactory
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the SessionControllerFactory
+
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the SessionControllerFactory
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionControllerFactory
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.CreateDeadSession (IDmbProvider dmbProvider)
+
+ +

Creates a ISessionController that appears to have started and died with exit code -1

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.RevisionInformation.ActiveTestMerges, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.AllowWebClient, Tgstation.Server.Api.Models.CompileJob.ByondVersion, Tgstation.Server.Api.Models.Internal.RevisionInformation.CommitSha, Tgstation.Server.Host.Components.IDmbProvider.CompileJob, Tgstation.Server.Host.Components.IDmbProvider.DmbName, Tgstation.Server.Host.Components.Interop.Constants.DMParamHostVersion, Tgstation.Server.Host.Components.Interop.Constants.DMParamInfoJson, Tgstation.Server.Api.Models.Internal.CompileJob.MinimumSecurityLevel, Tgstation.Server.Api.Models.Internal.RevisionInformation.OriginCommitSha, Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.PrimaryPort, 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, and Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.StartupTimeout.

+
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  //delete all previous tgs json files
142  var files = await ioManager.GetFilesWithExtension(basePath, JsonPostfix, cancellationToken).ConfigureAwait(false);
143 
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 localIoManager = new ResolvingIOManager(ioManager, basePath);
193 
194  var chatJsonTrackingTask = chat.TrackJsons(basePath, interopInfo.ChatChannelsJson, interopInfo.ChatCommandsJson, cancellationToken);
195 
196  await localIoManager.WriteAllBytes(interopJsonFile, Encoding.UTF8.GetBytes(interopJson), cancellationToken).ConfigureAwait(false);
197  var chatJsonTrackingContext = await chatJsonTrackingTask.ConfigureAwait(false);
198  try
199  {
200  //get the byond lock
201  var byondLock = currentByondLock ?? await byond.UseExecutables(Version.Parse(dmbProvider.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
202  try
203  {
204  //create interop context
205  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, interopInfo.ServerCommandsJson);
206  try
207  {
208  //set command line options
209  //more sanitization here cause it uses the same scheme
210  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));
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} -verbose -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 
220  //See #719
221  var noShellExecute = !platformIdentifier.IsWindows;
222  //launch dd
223  var process = processExecutor.LaunchProcess(byondLock.DreamDaemonPath, basePath, arguments, noShellExecute: noShellExecute);
224  try
225  {
227 
228  //return the session controller for it
229  var result = new SessionController(new ReattachInformation
230  {
231  AccessIdentifier = accessIdentifier,
232  Dmb = dmbProvider,
233  IsPrimary = primaryDirectory,
234  Port = portToUse.Value,
235  ProcessId = process.Id,
236  ChatChannelsJson = interopInfo.ChatChannelsJson,
237  ChatCommandsJson = interopInfo.ChatCommandsJson,
238  ServerCommandsJson = interopInfo.ServerCommandsJson,
239  }, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), launchParameters.SecurityLevel, launchParameters.StartupTimeout);
240 
241  //writeback launch parameter's fixed security level
242  launchParameters.SecurityLevel = securityLevelToUse;
243 
244  return result;
245  }
246  catch
247  {
248  process.Dispose();
249  throw;
250  }
251  }
252  catch
253  {
254  context.Dispose();
255  throw;
256  }
257  }
258  catch
259  {
260  if (currentByondLock == null)
261  byondLock.Dispose();
262  throw;
263  }
264  }
265  catch
266  {
267  chatJsonTrackingContext.Dispose();
268  throw;
269  }
270  }
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
+ +
readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionControllerFactory
+
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that ...
+
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
+
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
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
+ + + +
readonly IChat chat
The IChat for the SessionControllerFactory
+
string GetSecureString()
Generates a 40-length secure ascii string
+
DreamDaemonSecurity
DreamDaemon&#39;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&#39;s location and return a IByondExecutableLock
+
readonly IByondManager byond
The IByondManager for the SessionControllerFactory
+
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
+
ushort PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+ +
bool AllowWebClient
If the BYOND web client can be used to connect to the game server
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 273 of file SessionControllerFactory.cs.

+ +

References Tgstation.Server.Api.Models.CompileJob.ByondVersion, 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.Models.ReattachInformationBase.IsPrimary, Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory, Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId, Tgstation.Server.Host.Components.IDmbProvider.SecondaryDirectory, and Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson.

+
274  {
275  if (reattachInformation == null)
276  throw new ArgumentNullException(nameof(reattachInformation));
277 
278  SessionController result = null;
279  var basePath = reattachInformation.IsPrimary ? reattachInformation.Dmb.PrimaryDirectory : reattachInformation.Dmb.SecondaryDirectory;
280  var chatJsonTrackingContext = await chat.TrackJsons(basePath, reattachInformation.ChatChannelsJson, reattachInformation.ChatCommandsJson, cancellationToken).ConfigureAwait(false);
281  try
282  {
283  var byondLock = await byond.UseExecutables(Version.Parse(reattachInformation.Dmb.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
284  try
285  {
286  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, reattachInformation.ServerCommandsJson);
287  try
288  {
289  var process = processExecutor.GetProcess(reattachInformation.ProcessId);
290 
291  if (process != null)
292  try
293  {
295  result = new SessionController(reattachInformation, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), null, null);
296  }
297  finally
298  {
299  if (result == null)
300  process.Dispose();
301  }
302  }
303  finally
304  {
305  if (result == null)
306  context.Dispose();
307  }
308  }
309  finally
310  {
311  if (result == null)
312  byondLock.Dispose();
313  }
314  }
315  finally
316  {
317  if (result == null)
318  chatJsonTrackingContext.Dispose();
319  }
320  return result;
321  }
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&#39;s location and return a IByondExecutableLock
+
readonly IByondManager byond
The IByondManager for the SessionControllerFactory
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 86 of file SessionControllerFactory.cs.

+
87  {
88  switch (securityLevel)
89  {
90  case DreamDaemonSecurity.Safe:
91  return "safe";
92  case DreamDaemonSecurity.Trusted:
93  return "trusted";
94  case DreamDaemonSecurity.Ultrasafe:
95  return "ultrasafe";
96  default:
97  throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel));
98  }
99  }
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.application
+
+private
+
+ +

The IApplication for the SessionControllerFactory

+ +

Definition at line 49 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond
+
+private
+
+ +

The IByondManager for the SessionControllerFactory

+ +

Definition at line 34 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byondTopicSender
+
+private
+
+ +

The IByondTopicSender for the SessionControllerFactory

+ +

Definition at line 39 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IChat Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.chat
+
+private
+
+ +

The IChat for the SessionControllerFactory

+ +

Definition at line 59 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.cryptographySuite
+
+private
+
+ +

The ICryptographySuite for the SessionControllerFactory

+ +

Definition at line 44 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.instance
+
+private
+
+ +

The Api.Models.Instance for the SessionControllerFactory

+ +

Definition at line 79 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.ioManager
+
+private
+
+ +

The IIOManager for the SessionControllerFactory

+ +

Definition at line 54 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the SessionControllerFactory

+ +

Definition at line 74 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly INetworkPromptReaper Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.networkPromptReaper
+
+private
+
+ +

The INetworkPromptReaper for the SessionControllerFactory

+ +

Definition at line 64 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.platformIdentifier
+
+private
+
+ +

The IPlatformIdentifier for the SessionControllerFactory

+ +

Definition at line 69 of file SessionControllerFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.processExecutor
+
+private
+
+ +

The IProcessExecutor for the SessionControllerFactory

+ +

Definition at line 29 of file SessionControllerFactory.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_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_watchdog-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_watchdog-members.html new file mode 100644 index 0000000000..33acf9de68 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_watchdog-members.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog 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_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_watchdog.html new file mode 100644 index 0000000000..3fdaf08c82 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_watchdog.html @@ -0,0 +1,166 @@ + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog Class Reference
+
+
+ + + + + + +

+Public Member Functions

void TestConstruction ()
 
async Task TestSuccessfulLaunchAndShutdown ()
 
+

Detailed Description

+
+

Definition at line 17 of file TestWatchdog.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog.TestConstruction ()
+
+ +

Definition at line 20 of file TestWatchdog.cs.

+ +

References Tgstation.Server.Host.Components.Watchdog.Watchdog.Dispose().

+
21  {
22  Assert.ThrowsException<ArgumentNullException>(() => new Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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 Watchdog(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<Watchdog>>();
59  Assert.ThrowsException<ArgumentNullException>(() => new Watchdog(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 Watchdog(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 Watchdog(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
+
+
+
+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog.TestSuccessfulLaunchAndShutdown ()
+
+ +

Definition at line 73 of file TestWatchdog.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<Watchdog>>();
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 Watchdog(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-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog-members.html new file mode 100644 index 0000000000..b39a55940e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog-members.html @@ -0,0 +1,155 @@ + + + + + + +tgstation-server: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.Watchdog Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.Watchdog, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActiveCompileJobTgstation.Server.Host.Components.Watchdog.Watchdog
ActiveLaunchParametersTgstation.Server.Host.Components.Watchdog.Watchdog
activeParametersUpdatedTgstation.Server.Host.Components.Watchdog.Watchdogprivate
AlphaBravoStartupSeperationIntervalTgstation.Server.Host.Components.Watchdog.Watchdogprivate
AlphaIsActiveTgstation.Server.Host.Components.Watchdog.Watchdog
alphaServerTgstation.Server.Host.Components.Watchdog.Watchdogprivate
asyncDelayerTgstation.Server.Host.Components.Watchdog.Watchdogprivate
autoStartTgstation.Server.Host.Components.Watchdog.Watchdogprivate
bravoServerTgstation.Server.Host.Components.Watchdog.Watchdogprivate
byondTopicSenderTgstation.Server.Host.Components.Watchdog.Watchdogprivate
ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
chatTgstation.Server.Host.Components.Watchdog.Watchdogprivate
databaseContextFactoryTgstation.Server.Host.Components.Watchdog.Watchdogprivate
Dispose()Tgstation.Server.Host.Components.Watchdog.Watchdog
DisposeAndNullControllers()Tgstation.Server.Host.Components.Watchdog.Watchdogprivate
dmbFactoryTgstation.Server.Host.Components.Watchdog.Watchdogprivate
eventConsumerTgstation.Server.Host.Components.Watchdog.Watchdogprivate
HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
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.Watchdog
HandleRestart(Version updateVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdogprivate
instanceTgstation.Server.Host.Components.Watchdog.Watchdogprivate
jobManagerTgstation.Server.Host.Components.Watchdog.Watchdogprivate
LastLaunchParametersTgstation.Server.Host.Components.Watchdog.Watchdog
Launch(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdogprivate
loggerTgstation.Server.Host.Components.Watchdog.Watchdogprivate
monitorCtsTgstation.Server.Host.Components.Watchdog.Watchdogprivate
MonitorLifetimes(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdogprivate
monitorTaskTgstation.Server.Host.Components.Watchdog.Watchdogprivate
reattachInfoHandlerTgstation.Server.Host.Components.Watchdog.Watchdogprivate
RebootStateTgstation.Server.Host.Components.Watchdog.Watchdog
releaseServersTgstation.Server.Host.Components.Watchdog.Watchdogprivate
ResetRebootState(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
Restart(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
restartRegistrationTgstation.Server.Host.Components.Watchdog.Watchdogprivate
RunningTgstation.Server.Host.Components.Watchdog.Watchdog
semaphoreTgstation.Server.Host.Components.Watchdog.Watchdogprivate
sessionControllerFactoryTgstation.Server.Host.Components.Watchdog.Watchdogprivate
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
StopMonitor()Tgstation.Server.Host.Components.Watchdog.Watchdogprivate
Terminate(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdog
TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.Watchdogprivate
Watchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< Watchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)Tgstation.Server.Host.Components.Watchdog.Watchdog
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html new file mode 100644 index 0000000000..50d5dab46a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html @@ -0,0 +1,1856 @@ + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.Watchdog Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.Watchdog Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.Watchdog:
+
+
+ + +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

 Watchdog (IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< Watchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
 Construct a IWatchdog More...
 
void Dispose ()
 
async Task ChangeSettings (DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
 Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart More...
 
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 Terminate (bool graceful, CancellationToken cancellationToken)
 Stops the watchdog More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
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 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

Models.CompileJob ActiveCompileJob => (AlphaIsActive ? alphaServer : bravoServer)?.Dmb.CompileJob
 
RebootState RebootState => Running ? (AlphaIsActive ? alphaServer?.RebootState : bravoServer?.RebootState) : null
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool Running [get, private set]
 
bool AlphaIsActive [get, private set]
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get, private set]
 
DreamDaemonLaunchParameters LastLaunchParameters [get, private set]
 
- 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...
 
RebootState RebootState [get]
 The Components.Watchdog.RebootState of the active server More...
 
+ + + + + + + + + + + + + + + + + + + +

+Private Member Functions

void DisposeAndNullControllers ()
 Call IDisposable.Dispose on alphaServer and bravoServer and set them to More...
 
async Task TerminateNoLock (bool graceful, bool announce, CancellationToken cancellationToken)
 Implementation of Terminate(bool, CancellationToken). Does not lock semaphore More...
 
async Task HandlerMonitorWakeup (MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
 Handles the actions to take when the monitor has to "wake up" More...
 
async Task MonitorLifetimes (CancellationToken cancellationToken)
 The loop that watches the watchdog More...
 
async Task< bool > StopMonitor ()
 Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers More...
 
async Task LaunchImplNoLock (bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
 Launches the Watchdog 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...
 
readonly IChat chat
 The IChat for the Watchdog More...
 
readonly ISessionControllerFactory sessionControllerFactory
 The ISessionControllerFactory for the Watchdog More...
 
readonly IDmbFactory dmbFactory
 The IDmbFactory for the Watchdog More...
 
readonly IReattachInfoHandler reattachInfoHandler
 The IReattachInfoHandler for the Watchdog More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the Watchdog More...
 
readonly IByondTopicSender byondTopicSender
 The IByondTopicSender for the Watchdog More...
 
readonly IEventConsumer eventConsumer
 The IEventConsumer for the Watchdog More...
 
readonly IJobManager jobManager
 The IJobManager for the Watchdog More...
 
readonly IRestartRegistration restartRegistration
 The IRestartRegistration for the Watchdog More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the Watchdog More...
 
readonly ILogger< Watchdoglogger
 The ILogger<TCategoryName> for the Watchdog More...
 
readonly SemaphoreSlim semaphore
 The SemaphoreSlim for the Watchdog More...
 
readonly Api.Models.Instance instance
 The Api.Models.Instance for the Watchdog More...
 
readonly bool autoStart
 If the Watchdog 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...
 
TaskCompletionSource< object > activeParametersUpdated
 TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Running More...
 
ISessionController alphaServer
 Server designation alpha More...
 
ISessionController bravoServer
 Server designation bravo More...
 
bool releaseServers
 If the servers should be released instead of shutdown More...
 
+

Detailed Description

+
+

Definition at line 23 of file Watchdog.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.Watchdog.Watchdog (IChat chat,
ISessionControllerFactory sessionControllerFactory,
IDmbFactory dmbFactory,
IReattachInfoHandler reattachInfoHandler,
IDatabaseContextFactory databaseContextFactory,
IByondTopicSender byondTopicSender,
IEventConsumer eventConsumer,
IJobManager jobManager,
IServerControl serverControl,
IAsyncDelayer asyncDelayer,
ILogger< Watchdoglogger,
DreamDaemonLaunchParameters initialLaunchParameters,
Api.Models.Instance instance,
bool autoStart 
)
+
+ +

Construct a IWatchdog

+
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 164 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Chat.IChat.RegisterCommandHandler(), and Tgstation.Server.Host.Core.IServerControl.RegisterForRestart().

+
165  {
166  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
167  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
168  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
169  this.reattachInfoHandler = reattachInfoHandler ?? throw new ArgumentNullException(nameof(reattachInfoHandler));
170  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
171  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
172  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
173  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
174  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
175  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
176  ActiveLaunchParameters = initialLaunchParameters ?? throw new ArgumentNullException(nameof(initialLaunchParameters));
177  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
178  this.autoStart = autoStart;
179 
180  if (serverControl == null)
181  throw new ArgumentNullException(nameof(serverControl));
182 
183  chat.RegisterCommandHandler(this);
184 
185  AlphaIsActive = true;
186  ActiveLaunchParameters = initialLaunchParameters;
187  releaseServers = false;
188  activeParametersUpdated = new TaskCompletionSource<object>();
189 
190  restartRegistration = serverControl.RegisterForRestart(this);
191  try
192  {
193  semaphore = new SemaphoreSlim(1);
194  }
195  catch
196  {
197  restartRegistration.Dispose();
198  throw;
199  }
200  }
+
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+
void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
Registers a customCommandHandler to use
+
bool releaseServers
If the servers should be released instead of shutdown
Definition: Watchdog.cs:145
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Watchdog
Definition: Watchdog.cs:81
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the Watchdog
Definition: Watchdog.cs:111
+
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for the Watchdog
Definition: Watchdog.cs:56
+
DreamDaemonLaunchParameters ActiveLaunchParameters
Definition: Watchdog.cs:40
+
readonly bool autoStart
If the Watchdog should LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken) i...
Definition: Watchdog.cs:116
+
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the Watchdog
Definition: Watchdog.cs:66
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Watchdog
Definition: Watchdog.cs:91
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+
TaskCompletionSource< object > activeParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: Watchdog.cs:131
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the Watchdog
Definition: Watchdog.cs:76
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.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 683 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.Match().

+
684  {
685  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
686  {
687  if (launchParameters.Match(ActiveLaunchParameters))
688  return;
689  ActiveLaunchParameters = launchParameters;
690  if (Running)
691  //queue an update
692  activeParametersUpdated.TrySetResult(null);
693  }
694  }
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+ +
DreamDaemonLaunchParameters ActiveLaunchParameters
Definition: Watchdog.cs:40
+
bool Match(DreamDaemonLaunchParameters otherParameters)
Check if we match a given set of otherParameters
+
TaskCompletionSource< object > activeParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: Watchdog.cs:131
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.Watchdog.Dispose ()
+
+ +

+ +

Definition at line 203 of file Watchdog.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.Dispose(), and Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog.TestConstruction().

+
204  {
206  semaphore.Dispose();
207  restartRegistration.Dispose();
208  }
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+
void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to
Definition: Watchdog.cs:213
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Watchdog
Definition: Watchdog.cs:91
+
+
+
+ +
+
+ + + + + +
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.Watchdog.DisposeAndNullControllers ()
+
+private
+
+ +

Call IDisposable.Dispose on alphaServer and bravoServer and set them to

+ +

Definition at line 213 of file Watchdog.cs.

+
214  {
215  alphaServer?.Dispose();
216  alphaServer = null;
217  bravoServer?.Dispose();
218  bravoServer = null;
219  Running = false;
220  }
+
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<string> Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleChatCommand (string commandName,
string arguments,
Chat.User sender,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 1052 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMTopicChatCommand, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Components.Watchdog.ISessionController.SendCommand().

+
1053  {
1054  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
1055  {
1056  if (!Running)
1057  return "ERROR: Server offline!";
1058 
1059  var commandObject = new ChatCommand
1060  {
1061  Command = commandName,
1062  Parameters = arguments,
1063  User = sender
1064  };
1065 
1066  var json = JsonConvert.SerializeObject(commandObject, new JsonSerializerSettings
1067  {
1068  ContractResolver = new CamelCasePropertyNamesContractResolver()
1069  });
1070 
1071  var command = String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChatCommand), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(json));
1072 
1073  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
1074  return await activeServer.SendCommand(command, cancellationToken).ConfigureAwait(false) ?? "ERROR: Bad topic exchange!";
1075  }
1076  }
+ + +
Represents a server User
Definition: User.cs:10
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+ + + +
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the Watchdog
Definition: Watchdog.cs:76
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleEvent (EventType eventType,
IEnumerable< string > parameters,
CancellationToken cancellationToken 
)
+
+ +

Handle a given eventType

+ +

Implements Tgstation.Server.Host.Components.IEventConsumer.

+ +

Definition at line 1008 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMResponseSuccess, Tgstation.Server.Host.Components.Interop.Constants.DMTopicEvent, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Components.Watchdog.ISessionController.SendCommand().

+
1009  {
1010  string results;
1011  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
1012  {
1013  if (!Running)
1014  return true;
1015 
1016  var builder = new StringBuilder(Constants.DMTopicEvent);
1017  builder.Append('&');
1018  var notification = new EventNotification
1019  {
1020  Type = eventType,
1021  Parameters = parameters
1022  };
1023  var json = JsonConvert.SerializeObject(notification);
1024  builder.Append(byondTopicSender.SanitizeString(Constants.DMParameterData));
1025  builder.Append('=');
1026  builder.Append(byondTopicSender.SanitizeString(json));
1027 
1028  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
1029  results = await activeServer.SendCommand(builder.ToString(), cancellationToken).ConfigureAwait(false);
1030  }
1031 
1032  if (results == Constants.DMResponseSuccess)
1033  return true;
1034 
1035  List<Response> responses;
1036  try
1037  {
1038  responses = JsonConvert.DeserializeObject<List<Response>>(results);
1039  }
1040  catch
1041  {
1042  logger.LogInformation("Recieved invalid response from DD when parsing event {0}:{1}{2}", eventType, Environment.NewLine, results);
1043  return true;
1044  }
1045 
1046  await Task.WhenAll(responses.Select(x => chat.SendMessage(x.Message, x.ChannelIds, cancellationToken))).ConfigureAwait(false);
1047 
1048  return true;
1049  }
+
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+ +
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+ +
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+ +
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
+ + + +
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the Watchdog
Definition: Watchdog.cs:76
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleRestart (Version updateVersion,
CancellationToken cancellationToken 
)
+
+ +

Handle a restart of the server

+ +

Implements Tgstation.Server.Host.Core.IRestartHandler.

+ +

Definition at line 1079 of file Watchdog.cs.

+
1080  {
1081  releaseServers = true;
1082  if (Running)
1083  await chat.SendWatchdogMessage("Detaching...", cancellationToken).ConfigureAwait(false);
1084  }
bool releaseServers
If the servers should be released instead of shutdown
Definition: Watchdog.cs:145
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
+ +
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.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 256 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Watchdog.MonitorState.ActiveServer, Tgstation.Server.Host.Components.Watchdog.ISessionController.ClosePortOnReboot, Tgstation.Server.Host.Components.IDmbProvider.CompileJob, Tgstation.Server.Host.Components.Watchdog.ISessionController.Dmb, Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands(), 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.MonitorState.NextAction, Tgstation.Server.Host.Components.Watchdog.MonitorState.RebootingInactiveServer, Tgstation.Server.Host.Components.Watchdog.ISessionController.RebootState, Tgstation.Server.Host.Components.Watchdog.ISessionController.ResetRebootState(), Tgstation.Server.Host.Core.IProcessBase.SetHighPriority(), Tgstation.Server.Host.Components.Watchdog.ISessionController.SetPort(), and Tgstation.Server.Host.Components.Watchdog.ISessionController.TerminationWasRequested.

+
257  {
258  logger.LogDebug("Monitor activation. Reason: {0}", activationReason);
259 
260  //this is where the bulk of the watchdog handling code lives and is fraught with lambdas, sorry not sorry
261  //I'll do my best to walk you through it
262 
263  //returns true if the inactive server can't be used immediately
264  //also sets monitor to restart if the above holds
265  bool FullRestartDeadInactive()
266  {
267  if (monitorState.RebootingInactiveServer || monitorState.InactiveServerCritFail)
268  {
269  logger.LogInformation("Inactive server is {0}! Restarting monitor...", monitorState.InactiveServerCritFail ? "critically failed" : "still rebooting");
270  monitorState.NextAction = MonitorAction.Restart; //will dispose server
271  return true;
272  }
273  return false;
274  };
275 
276  //trys to set inactive server's port to the public game port
277  //doesn't handle closing active server's port
278  //returns true on success and swaps inactiveserver and activeserver also sets LastLaunchParameters to ActiveLaunchParameters
279  //on failure, sets monitor to restart
280  async Task<bool> MakeInactiveActive()
281  {
282  logger.LogDebug("Setting inactive server to port {0}...", ActiveLaunchParameters.PrimaryPort.Value);
283  var result = await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.PrimaryPort.Value, cancellationToken).ConfigureAwait(false);
284 
285  if (!result)
286  {
287  logger.LogWarning("Failed to activate inactive server! Restarting monitor...");
288  monitorState.NextAction = MonitorAction.Restart; //will dispose server
289  return false;
290  }
291 
292  //inactive server should always be using active launch parameters
294 
295  var tmp = monitorState.ActiveServer;
296  monitorState.ActiveServer = monitorState.InactiveServer;
297  monitorState.InactiveServer = tmp;
299  monitorState.ActiveServer.EnableCustomChatCommands();
300  return true;
301  }
302 
303  // Kills and tries to launch inactive server with the latest dmb
304  // falls back to current dmb on failure
305  // Sets critfail on inactive server failing that
306  // returns false if the backup dmb was used successfully, true otherwise
307  async Task UpdateAndRestartInactiveServer(bool breakAfter)
308  {
309  activeParametersUpdated = new TaskCompletionSource<object>();
310  monitorState.InactiveServer.Dispose(); //kill or recycle it
311  var desiredNextAction = breakAfter ? MonitorAction.Break : MonitorAction.Continue;
312  monitorState.NextAction = desiredNextAction;
313 
314  logger.LogInformation("Rebooting inactive server...");
315  var newDmb = dmbFactory.LockNextDmb(1);
316  try
317  {
318  monitorState.InactiveServer = await sessionControllerFactory.LaunchNew(ActiveLaunchParameters, newDmb, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
319  monitorState.InactiveServer.SetHighPriority();
320  }
321  catch (OperationCanceledException)
322  {
323  throw;
324  }
325  catch (Exception e)
326  {
327  logger.LogError("Error occurred while recreating server! Attempting backup strategy of running DMB of running server! Exception: {0}", e.ToString());
328  //ahh jeez, what do we do here?
329  //this is our fault, so it should never happen but
330  //idk maybe a database error while handling the newest dmb?
331  //either way try to start it using the active server's dmb as a backup
332  try
333  {
334  var dmbBackup = await dmbFactory.FromCompileJob(monitorState.ActiveServer.Dmb.CompileJob, cancellationToken).ConfigureAwait(false);
335 
336  if (dmbBackup == null) //NANI!?
337  //just give up, if THAT compile job is failing then the ActiveServer is gonna crash soon too or already has
338  throw new JobException("Creating backup DMB provider failed!");
339 
340  monitorState.InactiveServer = await sessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbBackup, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
341  monitorState.InactiveServer.SetHighPriority();
342  await chat.SendWatchdogMessage("Staging newest DMB on inactive server failed: {0} Falling back to previous dmb...", cancellationToken).ConfigureAwait(false);
343  }
344  catch (OperationCanceledException)
345  {
346  throw;
347  }
348  catch (Exception e2)
349  {
350  //fuuuuucckkk
351  logger.LogError("Backup strategy failed! Monitor will restart when active server reboots! Exception: {0}", e2.ToString());
352  monitorState.InactiveServerCritFail = true;
353  await chat.SendWatchdogMessage("Attempted reboot of inactive server failed. Watchdog will reset when active server fails or exits", cancellationToken).ConfigureAwait(false);
354  return;
355  }
356  }
357 
358  logger.LogInformation("Successfully relaunched inactive server!");
359  monitorState.RebootingInactiveServer = true;
360  }
361 
362  string ExitWord(ISessionController controller) => controller.TerminationWasRequested ? "exited" : "crashed";
363 
364  //reason handling
365  switch (activationReason)
366  {
367  case MonitorActivationReason.ActiveServerCrashed:
368  if (monitorState.ActiveServer.RebootState == Components.Watchdog.RebootState.Shutdown)
369  {
370  //the time for graceful shutdown is now
371  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Exiting due to graceful termination request...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
373  monitorState.NextAction = MonitorAction.Exit;
374  break;
375  }
376 
377  if (FullRestartDeadInactive())
378  {
379  //tell chat about it and go ahead
380  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Inactive server unable to online!", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
381  //we've already been set to restart
382  break;
383  }
384 
385  //tell chat about it
386  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Onlining inactive server...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
387 
388  //try to active the inactive server
389  if (!await MakeInactiveActive().ConfigureAwait(false))
390  //failing that, we've already been set to restart
391  break;
392 
393  //bring up another inactive server
394  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
395  break;
396  case MonitorActivationReason.InactiveServerCrashed:
397  //just announce and try to bring it back
398  await chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Inactive server {0}! Rebooting...", ExitWord(monitorState.InactiveServer)), cancellationToken).ConfigureAwait(false);
399  await UpdateAndRestartInactiveServer(false).ConfigureAwait(false);
400  break;
401  case MonitorActivationReason.ActiveServerRebooted:
402  //ideal goal: active server just closed its port
403  //tell inactive server to open it's port and that's now the active server
404  var rebootState = monitorState.ActiveServer.RebootState;
405  monitorState.ActiveServer.ResetRebootState(); //the DMAPI has already done this internally
406 
407  if (FullRestartDeadInactive() && rebootState != Components.Watchdog.RebootState.Shutdown)
408  //full restart if the inactive server is being fucky
409  break;
410 
411  //what matters here is the RebootState
412  var restartOnceSwapped = false;
413 
414  switch (rebootState)
415  {
416  case Components.Watchdog.RebootState.Normal:
417  //life as normal
418  break;
419  case Components.Watchdog.RebootState.Restart:
420  //reboot the current active server once the inactive one activates
421  restartOnceSwapped = true;
422  break;
423  case Components.Watchdog.RebootState.Shutdown:
424  //graceful shutdown time
425  await chat.SendWatchdogMessage("Active server rebooted! Exiting due to graceful termination request...", cancellationToken).ConfigureAwait(false);
427  monitorState.NextAction = MonitorAction.Exit;
428  return;
429  }
430 
431  //are both servers now running the same CompileJob?
432  var sameCompileJob = monitorState.InactiveServer.Dmb.CompileJob.Id == monitorState.ActiveServer.Dmb.CompileJob.Id;
433 
434  if (!sameCompileJob || ActiveLaunchParameters != LastLaunchParameters)
435  //need a new launch to update either settings or compile job
436  restartOnceSwapped = true;
437 
438  if (restartOnceSwapped)
439  //we need to manually restart active server
440  //just kill it here, easier that way
441  monitorState.ActiveServer.Dispose();
442 
443  var activeServerStillHasPortOpen = !restartOnceSwapped && !monitorState.ActiveServer.ClosePortOnReboot;
444 
445  if (activeServerStillHasPortOpen)
446  //we didn't want active server to swap for some reason and it still has it's port open
447  //just continue as normal
448  break;
449 
450  if (!await MakeInactiveActive().ConfigureAwait(false))
451  //monitor will restart
452  break;
453 
454  //servers now swapped
455 
456  //enable this now
457  monitorState.ActiveServer.ClosePortOnReboot = true;
458 
459  if (!restartOnceSwapped)
460  {
461  //inactive server still valid
462 
463  //disable this
464  monitorState.InactiveServer.ClosePortOnReboot = false;
465 
466  //now try to reopen it on the private port
467  //failing that, just reboot it
468  restartOnceSwapped = !await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.SecondaryPort.Value, cancellationToken).ConfigureAwait(false);
469  }
470 
471  //break either way because any issues past this point would be solved by the reboot
472  if (restartOnceSwapped)
473  //for one reason or another
474  //update and reboot
475  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
476  else
477  //only skip checking inactive server rebooted, it's guaranteed InactiveServerStartup complete wouldn't fire this iteration
478  monitorState.NextAction = MonitorAction.Skip;
479  break;
480  case MonitorActivationReason.InactiveServerRebooted:
481  //just don't let the active server close it's port if the inactive server isn't ready
482  monitorState.RebootingInactiveServer = true;
483  monitorState.InactiveServer.ResetRebootState();
484  monitorState.ActiveServer.ClosePortOnReboot = false;
485  monitorState.NextAction = MonitorAction.Continue;
486  break;
487  case MonitorActivationReason.InactiveServerStartupComplete:
488  //opposite of above case
489  monitorState.RebootingInactiveServer = false;
490  monitorState.ActiveServer.ClosePortOnReboot = true;
491  monitorState.NextAction = MonitorAction.Continue;
492  break;
493  case MonitorActivationReason.NewDmbAvailable:
494  case MonitorActivationReason.ActiveLaunchParametersUpdated:
495  //just reload the inactive server and wait for a swap to apply the changes
496  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
497  break;
498  }
499  }
+ +
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
+
void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to
Definition: Watchdog.cs:213
+
DreamDaemonLaunchParameters LastLaunchParameters
Definition: Watchdog.cs:43
+ +
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
+
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for the Watchdog
Definition: Watchdog.cs:56
+
MonitorActivationReason
Reasons for the monitor to wake up
+
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+
DreamDaemonLaunchParameters ActiveLaunchParameters
Definition: Watchdog.cs:40
+
Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the Watchdog
Definition: Watchdog.cs:61
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
TaskCompletionSource< object > activeParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: Watchdog.cs:131
+
ushort PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.Launch (CancellationToken cancellationToken)
+
+ +

Start the IWatchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 901 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
902  {
903  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
904  await LaunchImplNoLock(true, true, null, cancellationToken).ConfigureAwait(false);
905  }
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the Watchdog
Definition: Watchdog.cs:704
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.LaunchImplNoLock (bool startMonitor,
bool announce,
WatchdogReattachInformation reattachInfo,
CancellationToken cancellationToken 
)
+
+private
+
+ +

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 704 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha, Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive, Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo, Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb, Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands(), Tgstation.Server.Host.Components.Watchdog.ISessionController.LaunchResult, and Tgstation.Server.Host.Core.IProcessBase.SetHighPriority().

+
705  {
706  logger.LogTrace("Begin LaunchNoLock");
707 
708  if (Running)
709  throw new JobException("Watchdog already running!");
710 
711  Task chatTask;
712  //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
713  if (startMonitor && await StopMonitor().ConfigureAwait(false))
714  chatTask = chat.SendWatchdogMessage("Automatic retry sequence cancelled by manual launch. Restarting...", cancellationToken);
715  else if (announce)
716  //simple announce
717  chatTask = chat.SendWatchdogMessage(reattachInfo == null ? "Starting..." : "Reattaching...", cancellationToken);
718  else
719  //no announce
720  chatTask = Task.CompletedTask;
721 
722  //since neither server is running, this is safe to do
724 
725  //for when we call ourself and want to not catch thrown exceptions
726  var ignoreNestedException = false;
727  try
728  {
729  //good ole sanity, should never fucking trigger but i don't trust myself even though I should
730  if (alphaServer != null || bravoServer != null)
731  throw new InvalidOperationException("Entered LaunchNoLock with one or more of the servers not being null!");
732 
733  //don't need a new dmb if reattaching
734  var doesntNeedNewDmb = reattachInfo?.Alpha != null && reattachInfo?.Bravo != null;
735  var dmbToUse = doesntNeedNewDmb ? null : dmbFactory.LockNextDmb(2);
736 
737  //if this try catches something, both servers are killed
738  try
739  {
740  //start the alpha server task, either by launch a new process or attaching to an existing one
741  //The tasks returned are mainly for writing interop files to the directories among other things and should generally never fail
742  //The tasks pertaining to server startup times are in the ISessionControllers
743  Task<ISessionController> alphaServerTask;
744  if (!doesntNeedNewDmb)
745  alphaServerTask = sessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, true, true, false, cancellationToken);
746  else
747  alphaServerTask = sessionControllerFactory.Reattach(reattachInfo.Alpha, cancellationToken);
748 
749  //retrieve the session controller
750  var startTime = DateTimeOffset.Now;
751  alphaServer = await alphaServerTask.ConfigureAwait(false);
752  //failed reattaches will return null
754 
755  //extra delay for total ordering
756  var now = DateTimeOffset.Now;
757  var delay = now - startTime;
758 
759  //definitely not if reattaching though
760  if (reattachInfo == null && delay.TotalSeconds < AlphaBravoStartupSeperationInterval)
761  await asyncDelayer.Delay(startTime.AddSeconds(AlphaBravoStartupSeperationInterval) - now, cancellationToken).ConfigureAwait(false);
762 
763  //now bring bravo up
764  if (!doesntNeedNewDmb)
765  bravoServer = await sessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, false, false, false, cancellationToken).ConfigureAwait(false);
766  else
767  bravoServer = await sessionControllerFactory.Reattach(reattachInfo.Bravo, cancellationToken).ConfigureAwait(false);
768  //failed reattaches will return null
770 
771  //possiblity of null servers due to failed reattaches
772  if (alphaServer == null || bravoServer == null)
773  {
774  await chatTask.ConfigureAwait(false);
775  var bothServersDead = alphaServer == null && bravoServer == null;
776  if (bothServersDead
777  || (alphaServer == null && reattachInfo.AlphaIsActive)
778  || (bravoServer == null && !reattachInfo.AlphaIsActive))
779  {
780  //we lost the active server, just restart entirely
782  const string FailReattachMessage = "Unable to properly reattach to active server! Restarting...";
783  logger.LogWarning(FailReattachMessage);
784  logger.LogDebug(bothServersDead ? "Also could not reattach to inactive server!" : "Inactive server was reattached successfully!");
785  chatTask = chat.SendWatchdogMessage(FailReattachMessage, cancellationToken);
786  ignoreNestedException = true;
787  await LaunchImplNoLock(true, false, null, cancellationToken).ConfigureAwait(false);
788  return;
789  }
790 
791  //we still have the active server but the other one is dead to us, hand it off to the monitor to restart
792  const string InactiveReattachFailureMessage = "Unable to reattach to inactive server. Leaving for monitor to reboot...";
793  chatTask = chat.SendWatchdogMessage(InactiveReattachFailureMessage, cancellationToken);
794  logger.LogWarning(InactiveReattachFailureMessage);
795 
796  if (reattachInfo.AlphaIsActive)
797  bravoServer = sessionControllerFactory.CreateDeadSession(reattachInfo.Bravo.Dmb);
798  else
799  alphaServer = sessionControllerFactory.CreateDeadSession(reattachInfo.Alpha.Dmb);
800  }
801 
802  //throws a JobException if something went wrong with a launch
803  //Dead sessions won't trigger this
804  async Task<LaunchResult> CheckLaunch(ISessionController controller, string serverName)
805  {
806  var launch = await controller.LaunchResult.ConfigureAwait(false);
807  if (launch.ExitCode.HasValue)
808  //you killed us ray...
809  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{1} server failed to start: {0}", launch.ToString(), serverName));
810  if (!launch.StartupTime.HasValue)
811  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{1} server timed out on startup: {0}s", launch.ToString(), ActiveLaunchParameters.StartupTimeout.Value));
812  return launch;
813  }
814 
815  var alphaLrt = CheckLaunch(alphaServer, "Alpha");
816  var bravoLrt = CheckLaunch(bravoServer, "Bravo");
817  //this task completes when both serers have finished booting
818  var allTask = Task.WhenAll(alphaLrt, bravoLrt);
819 
820  //don't forget about the cancellationToken
821  var cancelTcs = new TaskCompletionSource<object>();
822  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
823  await Task.WhenAny(allTask, cancelTcs.Task).ConfigureAwait(false);
824  cancellationToken.ThrowIfCancellationRequested();
825 
826  await allTask.ConfigureAwait(false);
827 
828  //both servers are now running, alpha is the active server(unless reattach), huzzah
829  AlphaIsActive = reattachInfo?.AlphaIsActive ?? true;
830 
831  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
832  activeServer.EnableCustomChatCommands();
833  activeServer.ClosePortOnReboot = true;
834 
835  logger.LogInformation("Launched servers successfully");
836  Running = true;
837 
838  if (startMonitor)
839  {
840  monitorCts = new CancellationTokenSource();
842  }
843  }
844  catch
845  {
846  if (dmbToUse != null)
847  {
848  //we locked 2 dmbs
849  if (bravoServer == null)
850  {
851  //bravo didn't get control of his
852  dmbToUse.Dispose();
853  if (alphaServer == null)
854  //alpha didn't get control of his
855  dmbToUse.Dispose();
856  }
857  }
858  else if (doesntNeedNewDmb)
859  //we have reattachInfo
860  if (bravoServer == null)
861  {
862  //bravo didn't get control of his
863  reattachInfo.Bravo?.Dmb.Dispose();
864  if (alphaServer == null)
865  //alpha didn't get control of his
866  reattachInfo.Alpha?.Dmb.Dispose();
867  }
868  //kill the controllers
870  throw;
871  }
872  }
873  catch (Exception e)
874  {
875  //don't try to send chat tasks or warning logs if were suppressing exceptions or cancelled
876  if (!ignoreNestedException && !cancellationToken.IsCancellationRequested)
877  {
878  var originalChatTask = chatTask;
879  async Task ChainChatTaskWithErrorMessage()
880  {
881  await originalChatTask.ConfigureAwait(false);
882  await chat.SendWatchdogMessage("Startup failed!", cancellationToken).ConfigureAwait(false);
883  }
884  chatTask = ChainChatTaskWithErrorMessage();
885  logger.LogWarning("Failed to start watchdog: {0}", e.ToString());
886  }
887  throw;
888  }
889  finally
890  {
891  //finish the chat task that's in flight
892  try
893  {
894  await chatTask.ConfigureAwait(false);
895  }
896  catch (OperationCanceledException) { }
897  }
898  }
+ +
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+
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 ...
+
Task< LaunchResult > LaunchResult
A Task that completes when DreamDaemon starts pumping the windows message queue after loading a ...
+
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
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the Watchdog
Definition: Watchdog.cs:704
+
Task monitorTask
The Task running the monitor loop
Definition: Watchdog.cs:126
+
void SetHighPriority()
Set&#39;s the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal
+
void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to
Definition: Watchdog.cs:213
+
DreamDaemonLaunchParameters LastLaunchParameters
Definition: Watchdog.cs:43
+
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
+
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn&#39;t kill the servers
Definition: Watchdog.cs:669
+
async Task MonitorLifetimes(CancellationToken cancellationToken)
The loop that watches the watchdog
Definition: Watchdog.cs:506
+
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for the Watchdog
Definition: Watchdog.cs:56
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+ +
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+
DreamDaemonLaunchParameters ActiveLaunchParameters
Definition: Watchdog.cs:40
+
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the Watchdog
Definition: Watchdog.cs:61
+
CancellationTokenSource monitorCts
The CancellationTokenSource for the monitor loop
Definition: Watchdog.cs:121
+
const int AlphaBravoStartupSeperationInterval
The time in seconds to wait from starting alphaServer to start bravoServer. Does not take responsiven...
Definition: Watchdog.cs:28
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Watchdog
Definition: Watchdog.cs:96
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.MonitorLifetimes (CancellationToken cancellationToken)
+
+private
+
+ +

The loop that watches the watchdog

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 506 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Core.IProcessBase.Lifetime, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Components.Watchdog.MonitorState.NextAction.

+
507  {
508  logger.LogTrace("Entered MonitorLifetimes");
509 
510  //this function is responsible for calling HandlerMonitorWakeup when necessary and manitaining the MonitorState
511 
512  var iteration = 1;
513  for (var monitorState = new MonitorState(); monitorState.NextAction != MonitorAction.Exit; ++iteration)
514  {
515  //always start out with continue
516  monitorState.NextAction = MonitorAction.Continue;
517 
518  //dump some info to the logs
519  logger.LogDebug("Iteration {0} of monitor loop", iteration);
520  try
521  {
522  if (AlphaIsActive)
523  logger.LogDebug("Alpha is the active server");
524  else
525  logger.LogDebug("Bravo is the active server");
526 
527 
528  if (monitorState.RebootingInactiveServer)
529  logger.LogDebug("Inactive server is rebooting");
530 
531  //update the monitor state with the inactive/active servers
532  monitorState.ActiveServer = AlphaIsActive ? alphaServer : bravoServer;
533  monitorState.InactiveServer = AlphaIsActive ? bravoServer : alphaServer;
534 
535  if (monitorState.ActiveServer.ClosePortOnReboot)
536  logger.LogDebug("Active server will close port on reboot");
537  if (monitorState.InactiveServer.ClosePortOnReboot)
538  logger.LogDebug("Inactive server will close port on reboot");
539 
540  logger.LogDebug("Active server Compile Job ID: {0}", monitorState.ActiveServer.Dmb.CompileJob.Id);
541  logger.LogDebug("Inactive server Compile Job ID: {0}", monitorState.InactiveServer.Dmb.CompileJob.Id);
542 
543  //load the activation tasks into local variables
544  Task activeServerLifetime = monitorState.ActiveServer.Lifetime;
545  Task inactiveServerLifetime = monitorState.InactiveServer.Lifetime;
546  var activeServerReboot = monitorState.ActiveServer.OnReboot;
547  var inactiveServerReboot = monitorState.InactiveServer.OnReboot;
548  Task inactiveServerStartup = monitorState.RebootingInactiveServer ? monitorState.InactiveServer.LaunchResult : null;
549  Task activeLaunchParametersChanged = activeParametersUpdated.Task;
550  var newDmbAvailable = dmbFactory.OnNewerDmb;
551 
552  //cancel waiting if requested
553  var cancelTcs = new TaskCompletionSource<object>();
554  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
555  {
556  var toWaitOn = Task.WhenAny(activeServerLifetime, inactiveServerLifetime, activeServerReboot, inactiveServerReboot, newDmbAvailable, cancelTcs.Task, activeLaunchParametersChanged);
557  if (monitorState.RebootingInactiveServer)
558  toWaitOn = Task.WhenAny(toWaitOn, inactiveServerStartup);
559  //wait for something to happen
560  await toWaitOn.ConfigureAwait(false);
561  cancellationToken.ThrowIfCancellationRequested();
562  }
563 
564  var chatTask = Task.CompletedTask;
565  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
566  {
567  //always run HandleMonitorWakeup from the context of the semaphore lock
568  //multiple things may have happened, handle them one at a time
569  for (var moreActivationsToProcess = true; moreActivationsToProcess && (monitorState.NextAction == MonitorAction.Continue || monitorState.NextAction == MonitorAction.Skip);)
570  {
571  MonitorActivationReason activationReason = default; //this will always be assigned before being used
572 
573  //process the tasks in this order and call HandlerMonitorWakup for each
574 
575  bool CheckActivationReason(ref Task task, MonitorActivationReason testActivationReason)
576  {
577  var taskCompleted = task?.IsCompleted == true;
578  task = null;
579  if (monitorState.NextAction == MonitorAction.Skip)
580  monitorState.NextAction = MonitorAction.Continue;
581  else if (taskCompleted)
582  {
583  activationReason = testActivationReason;
584  return true;
585  }
586  return false;
587  };
588 
589  if (CheckActivationReason(ref activeServerLifetime, MonitorActivationReason.ActiveServerCrashed)
590  || CheckActivationReason(ref inactiveServerLifetime, MonitorActivationReason.InactiveServerCrashed)
591  || CheckActivationReason(ref activeServerReboot, MonitorActivationReason.ActiveServerRebooted)
592  || CheckActivationReason(ref inactiveServerReboot, MonitorActivationReason.InactiveServerRebooted)
593  || CheckActivationReason(ref inactiveServerStartup, MonitorActivationReason.InactiveServerStartupComplete)
594  || CheckActivationReason(ref newDmbAvailable, MonitorActivationReason.NewDmbAvailable)
595  || CheckActivationReason(ref activeLaunchParametersChanged, MonitorActivationReason.ActiveLaunchParametersUpdated))
596  await HandlerMonitorWakeup(activationReason, monitorState, cancellationToken).ConfigureAwait(false);
597  else
598  moreActivationsToProcess = false;
599  }
600 
601  //writeback alphaServer and bravoServer from monitor state in case they changesd
602  alphaServer = AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
603  bravoServer = !AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
604  }
605 
606  //full reboot required
607  if (monitorState.NextAction == MonitorAction.Restart)
608  {
609  logger.LogDebug("Next state action is to restart");
611  chatTask = chat.SendWatchdogMessage("Restarting entirely due to complications...", cancellationToken);
612 
613  for (var retryAttempts = 1; monitorState.NextAction == MonitorAction.Restart; ++retryAttempts)
614  {
615  Exception launchException = null;
616  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
617  try
618  {
619  //use LaunchImplNoLock without announcements or restarting the monitor
620  await LaunchImplNoLock(false, false, null, cancellationToken).ConfigureAwait(false);
621  if (Running)
622  {
623  logger.LogDebug("Relaunch successful, resetting monitor state...");
624  monitorState = new MonitorState(); //clean the slate and continue
625  }
626  }
627  catch (OperationCanceledException)
628  {
629  throw;
630  }
631  catch (Exception e)
632  {
633  launchException = e;
634  }
635 
636  await chatTask.ConfigureAwait(false);
637  if (!Running)
638  {
639  if (launchException == null)
640  logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}", retryAttempts);
641  else
642  logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}, Exception: {1}", retryAttempts, launchException);
643  var retryDelay = Math.Min(Math.Pow(2, retryAttempts), 3600); //max of one hour, increasing by a power of 2 each time
644  chatTask = chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Failed to restart watchdog (Attempt: {0}), retrying in {1} seconds...", retryAttempts, retryDelay), cancellationToken);
645  await Task.WhenAll(asyncDelayer.Delay(TimeSpan.FromSeconds(retryDelay), cancellationToken), chatTask).ConfigureAwait(false);
646  }
647  }
648  }
649  }
650  catch (OperationCanceledException)
651  {
652  logger.LogDebug("Monitor cancelled");
653  break;
654  }
655  catch (Exception e)
656  {
657  //really, this should NEVER happen
658  logger.LogError("Monitor crashed! Iteration: {0}, State: {1}, Exception: {2}", iteration, JsonConvert.SerializeObject(monitorState), e);
659  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);
660  }
661  }
662  logger.LogTrace("Monitor exiting...");
663  }
+ +
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the Watchdog
Definition: Watchdog.cs:704
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+
void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to
Definition: Watchdog.cs:213
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
MonitorActivationReason
Reasons for the monitor to wake up
+ +
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+
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
+
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
async Task HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
Handles the actions to take when the monitor has to "wake up"
Definition: Watchdog.cs:256
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the Watchdog
Definition: Watchdog.cs:61
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Watchdog
Definition: Watchdog.cs:96
+
TaskCompletionSource< object > activeParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: Watchdog.cs:131
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+ +
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.ResetRebootState (CancellationToken cancellationToken)
+
+ +

Cancels pending graceful actions

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 908 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Components.Watchdog.ISessionController.ResetRebootState().

+
909  {
910  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
911  {
912  if (!Running)
913  return;
914  var toClear = AlphaIsActive ? alphaServer : bravoServer;
915  if (toClear != null)
916  toClear.ResetRebootState();
917  }
918  }
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+ +
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI ...
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.Restart (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Restarts the watchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 921 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
922  {
923  logger.LogTrace("Begin Restart. Graceful: {0}", graceful);
924  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
925  {
926  if (!graceful || !Running)
927  {
928  Task chatTask;
929  if (Running)
930  {
931  chatTask = chat.SendWatchdogMessage("Manual restart triggered...", cancellationToken);
932  await TerminateNoLock(false, false, cancellationToken).ConfigureAwait(false);
933  }
934  else
935  chatTask = Task.CompletedTask;
936  await LaunchImplNoLock(true, !Running, null, cancellationToken).ConfigureAwait(false);
937  await chatTask.ConfigureAwait(false);
938  }
939  var toReboot = AlphaIsActive ? alphaServer : bravoServer;
940  if (toReboot != null)
941  {
942  if (!await toReboot.SetRebootState(Components.Watchdog.RebootState.Restart, cancellationToken).ConfigureAwait(false))
943  logger.LogWarning("Unable to send reboot state change event!");
944  }
945  }
946  }
+
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the Watchdog
Definition: Watchdog.cs:704
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+ +
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
Implementation of Terminate(bool, CancellationToken). Does not lock semaphore
Definition: Watchdog.cs:228
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+ +
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 956 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Instance.Instance(), and Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+
957  {
958  var reattachInfo = await reattachInfoHandler.Load(cancellationToken).ConfigureAwait(false);
959  if (!autoStart && reattachInfo == null)
960  return;
961 
962  long? adminUserId = null;
963 
964  await databaseContextFactory.UseContext(async db => adminUserId = await db.Users
965  .Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant())
966  .Select(x => x.Id)
967  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
968  var job = new Models.Job
969  {
970  StartedBy = new Models.User
971  {
972  Id = adminUserId.Value
973  },
974  Instance = new Models.Instance
975  {
976  Id = instance.Id
977  },
978  Description = "Instance startup watchdog launch",
979  CancelRight = (ulong)DreamDaemonRights.Shutdown,
980  CancelRightsType = RightsType.DreamDaemon
981  };
982  await jobManager.RegisterOperation(job, async (j, databaseContext, progressFunction, ct) =>
983  {
984  using (await SemaphoreSlimContext.Lock(semaphore, ct).ConfigureAwait(false))
985  await LaunchImplNoLock(true, true, reattachInfo, ct).ConfigureAwait(false);
986  }, cancellationToken).ConfigureAwait(false);
987  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Watchdog
Definition: Watchdog.cs:71
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the Watchdog
Definition: Watchdog.cs:704
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+
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 Watchdog
Definition: Watchdog.cs:86
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the Watchdog
Definition: Watchdog.cs:111
+
readonly bool autoStart
If the Watchdog should LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken) i...
Definition: Watchdog.cs:116
+
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 IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the Watchdog
Definition: Watchdog.cs:66
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 990 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha, and Tgstation.Server.Host.Components.Watchdog.ISessionController.Release().

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+
991  {
992  if (releaseServers && Running)
993  {
994  await StopMonitor().ConfigureAwait(false);
995 
996  var reattachInformation = new WatchdogReattachInformation
997  {
999  };
1000  reattachInformation.Alpha = alphaServer?.Release();
1001  reattachInformation.Bravo = bravoServer?.Release();
1002  await reattachInfoHandler.Save(reattachInformation, cancellationToken).ConfigureAwait(false);
1003  }
1004  await Terminate(false, cancellationToken).ConfigureAwait(false);
1005  }
+
async Task Terminate(bool graceful, CancellationToken cancellationToken)
Stops the watchdog
Definition: Watchdog.cs:949
+
bool releaseServers
If the servers should be released instead of shutdown
Definition: Watchdog.cs:145
+
Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation
+
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn&#39;t kill the servers
Definition: Watchdog.cs:669
+ +
ReattachInformation Release()
Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose ...
+
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the Watchdog
Definition: Watchdog.cs:66
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
+
+
+ +
+
+ + + + + +
+ + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.Watchdog.Watchdog.StopMonitor ()
+
+private
+
+ +

Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers

+
Returns
if the monitor was running, otherwise
+ +

Definition at line 669 of file Watchdog.cs.

+
670  {
671  logger.LogTrace("StopMonitor");
672  if (monitorTask == null)
673  return false;
674  monitorCts.Cancel();
675  await monitorTask.ConfigureAwait(false);
676  monitorCts.Dispose();
677  monitorTask = null;
678  return true;
679  }
readonly ILogger< Watchdog > logger
The ILogger<TCategoryName> for the Watchdog
Definition: Watchdog.cs:101
+
Task monitorTask
The Task running the monitor loop
Definition: Watchdog.cs:126
+
CancellationTokenSource monitorCts
The CancellationTokenSource for the monitor loop
Definition: Watchdog.cs:121
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.Terminate (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Stops the watchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 949 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+
950  {
951  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
952  await TerminateNoLock(graceful, !releaseServers, cancellationToken).ConfigureAwait(false);
953  }
bool releaseServers
If the servers should be released instead of shutdown
Definition: Watchdog.cs:145
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the Watchdog
Definition: Watchdog.cs:106
+
async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
Implementation of Terminate(bool, CancellationToken). Does not lock semaphore
Definition: Watchdog.cs:228
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Watchdog.TerminateNoLock (bool graceful,
bool announce,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Implementation of Terminate(bool, CancellationToken). Does not lock semaphore

+
Parameters
+ + + + +
gracefulIf the termination will be delayed until a reboot is detected in the active server's DMAPI and this function will return immediately
announceIf the termination will be announced using chat
cancellationTokenThe CancellationToken for the operation
+
+
+ +

Definition at line 228 of file Watchdog.cs.

+ +

References Tgstation.Server.Host.Components.Watchdog.ISessionController.SetRebootState().

+
229  {
230  if (!Running)
231  return;
232  if (!graceful)
233  {
234  var chatTask = announce ? chat.SendWatchdogMessage("Terminating...", cancellationToken) : Task.CompletedTask;
235  await StopMonitor().ConfigureAwait(false);
237  LastLaunchParameters = null;
238  await chatTask.ConfigureAwait(false);
239  return;
240  }
241 
242  //merely set the reboot state
243  var toKill = AlphaIsActive ? alphaServer : bravoServer;
244  var other = AlphaIsActive ? bravoServer : alphaServer;
245  if (toKill != null)
246  await toKill.SetRebootState(Components.Watchdog.RebootState.Shutdown, cancellationToken).ConfigureAwait(false);
247  }
+
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
+
void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to
Definition: Watchdog.cs:213
+
DreamDaemonLaunchParameters LastLaunchParameters
Definition: Watchdog.cs:43
+
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn&#39;t kill the servers
Definition: Watchdog.cs:669
+ +
readonly IChat chat
The IChat for the Watchdog
Definition: Watchdog.cs:51
+
ISessionController alphaServer
Server designation alpha
Definition: Watchdog.cs:136
+
ISessionController bravoServer
Server designation bravo
Definition: Watchdog.cs:140
+
+
+
+

Member Data Documentation

+ +
+
+ + + + +
Models.CompileJob Tgstation.Server.Host.Components.Watchdog.Watchdog.ActiveCompileJob => (AlphaIsActive ? alphaServer : bravoServer)?.Dmb.CompileJob
+
+ +

+ +

Definition at line 37 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Watchdog.Watchdog.activeParametersUpdated
+
+private
+
+ +

TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Running

+ +

Definition at line 131 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Components.Watchdog.Watchdog.AlphaBravoStartupSeperationInterval = 10
+
+private
+
+ +

The time in seconds to wait from starting alphaServer to start bravoServer. Does not take responsiveness into account

+ +

Definition at line 28 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.Watchdog.alphaServer
+
+private
+
+ +

Server designation alpha

+ +

Definition at line 136 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Watchdog.Watchdog.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the Watchdog

+ +

Definition at line 96 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly bool Tgstation.Server.Host.Components.Watchdog.Watchdog.autoStart
+
+private
+
+
+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.Watchdog.bravoServer
+
+private
+
+ +

Server designation bravo

+ +

Definition at line 140 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.Watchdog.Watchdog.byondTopicSender
+
+private
+
+ +

The IByondTopicSender for the Watchdog

+ +

Definition at line 76 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IChat Tgstation.Server.Host.Components.Watchdog.Watchdog.chat
+
+private
+
+ +

The IChat for the Watchdog

+ +

Definition at line 51 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Watchdog.Watchdog.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the Watchdog

+ +

Definition at line 71 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDmbFactory Tgstation.Server.Host.Components.Watchdog.Watchdog.dmbFactory
+
+private
+
+ +

The IDmbFactory for the Watchdog

+ +

Definition at line 61 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Watchdog.Watchdog.eventConsumer
+
+private
+
+ +

The IEventConsumer for the Watchdog

+ +

Definition at line 81 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.Watchdog.Watchdog.instance
+
+private
+
+ +

The Api.Models.Instance for the Watchdog

+ +

Definition at line 111 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.Watchdog.Watchdog.jobManager
+
+private
+
+ +

The IJobManager for the Watchdog

+ +

Definition at line 86 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Watchdog> Tgstation.Server.Host.Components.Watchdog.Watchdog.logger
+
+private
+
+ +

The ILogger<TCategoryName> for the Watchdog

+ +

Definition at line 101 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Components.Watchdog.Watchdog.monitorCts
+
+private
+
+ +

The CancellationTokenSource for the monitor loop

+ +

Definition at line 121 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.Watchdog.monitorTask
+
+private
+
+ +

The Task running the monitor loop

+ +

Definition at line 126 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IReattachInfoHandler Tgstation.Server.Host.Components.Watchdog.Watchdog.reattachInfoHandler
+
+private
+
+ +

The IReattachInfoHandler for the Watchdog

+ +

Definition at line 66 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + +
RebootState Tgstation.Server.Host.Components.Watchdog.Watchdog.RebootState => Running ? (AlphaIsActive ? alphaServer?.RebootState : bravoServer?.RebootState) : null
+
+ +

+ +

Definition at line 46 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.Watchdog.releaseServers
+
+private
+
+ +

If the servers should be released instead of shutdown

+ +

Definition at line 145 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IRestartRegistration Tgstation.Server.Host.Components.Watchdog.Watchdog.restartRegistration
+
+private
+
+ +

The IRestartRegistration for the Watchdog

+ +

Definition at line 91 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Watchdog.Watchdog.semaphore
+
+private
+
+ +

The SemaphoreSlim for the Watchdog

+ +

Definition at line 106 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISessionControllerFactory Tgstation.Server.Host.Components.Watchdog.Watchdog.sessionControllerFactory
+
+private
+
+ +

The ISessionControllerFactory for the Watchdog

+ +

Definition at line 56 of file Watchdog.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
DreamDaemonLaunchParameters Tgstation.Server.Host.Components.Watchdog.Watchdog.ActiveLaunchParameters
+
+getprivate set
+
+ +

+ +

Definition at line 40 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.Watchdog.AlphaIsActive
+
+getprivate set
+
+ +

+ +

Definition at line 34 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonLaunchParameters Tgstation.Server.Host.Components.Watchdog.Watchdog.LastLaunchParameters
+
+getprivate set
+
+ +

+ +

Definition at line 43 of file Watchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.Watchdog.Running
+
+getprivate set
+
+ +

+ +

Definition at line 31 of file Watchdog.cs.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7c4bf9d2d390ac26e81a2f98eb4a19f794a9cc GIT binary patch literal 3820 zcmcIneLT}^8z(6rNq!}gvifa>k_jbwSsg=5UP4h`CgSADOLV-9vC@e}Z8b>}dO4`0 z=+#SX^W-hltT>3USZir)L)aSI^II>^`JB(wIe(nzbMDV)_wT;$>%Onw^}Da@`hM@7 z@o;lqtiDoRNl9rjW*6F1NofHHjfrY1P#;jHVgo%^ceIkX*nV)qn9t7vp=m(*lv$X?Dti(KhB0lKn4KFH@eDDQ zqyBD`7_lquV>#n?f0g#kWFGcYr0v@iW^1u#)bhXgrI~A|^BD%z>CGxGr!3p)W9c*E1m6u`B`vG1G~3 z2_d{1a`h>aNNgCY-o!>0%B9Dxe4(0^|@?r4y*EEIi*F3Gxa zb!jL;80eX30OT9%?meE`^zyk+-)PqHyd%p2pB#Vc#teTFSL%bkfUtTA1!091NJ3>X zlLn^Amnj$Ju=sRcM^}Dv&)xGM=-5;>MdnAma(TpS!Pt!Mfe=-t3-Q2wV%|bAE z|7EY$(_nCdupL=Iz>cIxqZ_xXyi55h?`S27?$nrsGzpDH*GF?_(2f7fZg&W(jH_@) zQ_i+VlZgEG1m=}=at1*k@XMmD1hB$^ruKm`g^5Z+SWh<)6FOW5#Vxt#+t-P=Kyz%^ ze&GJAa+}CJ1bkc{9(?t$rpPQcsGfpyl$#8yqPbI~5j~=OGKUiwKAR zw=$t}XIQ#+X5Z3=zyPxLrTn!Mf3`9bMQl*j*japH9@0Hu8LH)aEpK%r(T6(fWBnkd z@2X};PRFa*7VTDs3|*^l>kK=w_LjEU{G55}+L5X&(!MiaXB)ZTpI1afjXO3rcDIg7 zrRI=fMjqF8oHX>rrp;4T*ETw*_F3*Ap7@@48TQxuui7*TREOW&|Hs{8-XD?nnkOVL zR@P3m_o7@x;M9*}cT*?`_v?QSoG-$5QFwcyWzf+=nW6x_tqv4h@+VIyHHvpp)+%u3 zksjqO?zdbBw7+G{PzCeYHW?ysb#5n$a96-=Uf0UDwy#VT<5RyvskHUXMp#VT^AB*k zjV)&SmAHdYJjgq9$p^)4t1k+L^qpzKi{==E>rl=g zbFqk+so$5pC)S!|a2`S6@>5b<6ewMBmMGs%Wi1k=X>=ZJleWXiD8ah@;2d?`AbeeLJSkB)dip+df7>+r&BiyY* z+<&=eu+BOkc_ebmrwD5rQb}BxZrEy23yi=PwyeVl6sa^Jxo zZVMQ!Wz1W47Yuez!xalQgi>sOfGT&Wkmx&l=`_DQUKCLZqujY%WKbj(_og)UI897d z^j=D_%3k7dK(#sS&}*`_OfoivdC=kmjF<7Ln{VlZ!R(6ZOONtm1R+I5xH&6^Gx?a^bNj&sE0qY)p=Jnw6fTio}u* zIsnXQx>M|AIsmH|nl$whk9n?d zg)4AMKq8KH55{%j2&@?i1HDy>kEAE~b~it)_=yqws~>#$q{3?~e7LGx%0RaPegW~c zk3wL)sgG7&Ti!-?Zp<$Bk8bVEo?MF5o%-GE8DhiQJec*{Sp0pKt~8<6uOgy8@>Im! z5K?fDZ^pk%#it&ht|C?+N~DaA??cZDlA;a!(i!m+1;~Lm68*i1I}jI;Y7RP`kF`r$ z4rClo?biWpiuX{Q6*bYn3J}%~h3HXv;`cCrT_nNW_s+cd!(!c3?_;fCFsnSROoHFEILT*v8wG1HL<_m&#n?Ix(n zz5&PEsb=7U3lsQA9cFCq6`c-oLZoam3nw}itxprW zAbo@g+j7}jB;-tzE@`&<96KL>=rNg+=yUA^*3!jqQf1Yao$ zSKH78k%!iflk>=;1*(Ov#R|apc*701P>_WJ*i{1ys;c5uGGZY4pQ5o zs-1}I(@>BFL^V53-ngp-k;wnf=aw@6c?IvkTu}wJiE$MLO^DDRTok-9uNY8P$Q~b zW(Dz}wk^3E2DxRX_1GxU;4TVsFlf!c_KIu|5+Hi3-_akmH-obztcClLh3zry)l56O z3g(Bx+tX7(6H?Q?ne1gg_QP$Nw&ptV;b_I177TCA>a&mQS{q|+U(U9e3q<#C26UX^ z5Sbf!ym1mth#Fq5m(M2n&L-3)J$gaLX62C+2BQP6PREAp0j2t-y}5z-q^8z#_a(xD z6jM}6ii;|&B5#*jq3>NLLF*D5O*Ijm%9HK1z9ZAi>a(b+=XHjRu3q>Y+<#b7hsqosuWacQCz0Hov>J zO7r=Wg}Iz8qOY&~Q^!_NN3*W*eeCQy_>j_pb!hZXx z0-Y_Cn{(LiiDxcfQU}|-T4zf3-o>#I4#V?beS6paTMdVd9Hf#a+lhZ$ks`l@`o`Z( ns#Tg94%Sd-sH|GpE?0VF%{#(+c##hMHC4hmx}nQ|2uk}8^IPL_ 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..d0003b5786 --- /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,117 @@ + + + + + + +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
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)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..1db518b44c --- /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,435 @@ + + + + + + +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)
 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...
 
+

Detailed Description

+
+

Definition at line 12 of file WatchdogFactory.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.WatchdogFactory (IServerControl serverControl,
ILoggerFactory loggerFactory,
IDatabaseContextFactory databaseContextFactory,
IByondTopicSender byondTopicSender,
IJobManager jobManager,
IAsyncDelayer asyncDelayer 
)
+
+ +

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
+
+
+ +

Definition at line 53 of file WatchdogFactory.cs.

+ +

References Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.AutoStart.

+
54  {
55  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
56  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
57  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
58  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
59  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
60  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
61  }
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the WatchdogFactory
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the WatchdogFactory
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IWatchdog Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.CreateWatchdog (IChat chat,
IDmbFactory dmbFactory,
IReattachInfoHandler reattachInfoHandler,
IEventConsumer eventConsumer,
ISessionControllerFactory sessionControllerFactory,
Api.Models.Instance instance,
DreamDaemonSettings settings 
)
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the WatchdogFactory

+ +

Definition at line 42 of file WatchdogFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.byondTopicSender
+
+private
+
+ +

The IByondTopicSender for the WatchdogFactory

+ +

Definition at line 32 of file WatchdogFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.databaseContextFactory
+
+private
+
+ +

The IDatabaseContextFactory for the WatchdogFactory

+ +

Definition at line 27 of file WatchdogFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager
+
+private
+
+ +

The IJobManager for the WatchdogFactory

+ +

Definition at line 37 of file WatchdogFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the WatchdogFactory

+ +

Definition at line 22 of file WatchdogFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IServerControl Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.serverControl
+
+private
+
+ +

The IServerControl for the WatchdogFactory

+ +

Definition at line 17 of file WatchdogFactory.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_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..c127b02823 --- /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,117 @@ + + + + + + +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..2f63083123 --- /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,303 @@ + + + + + + +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

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.WatchdogReattachInformation ()
+
+ +

Construct a WatchdogReattachInformation

+ +

Definition at line 25 of file WatchdogReattachInformation.cs.

+
25 { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
override string Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.ToString ()
+
+ +

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ReattachInformation Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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..d82495884d --- /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,124 @@ + + + + + + +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..548fdebacb --- /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,587 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 88 of file WindowsNetworkPromptReaper.cs.

+
89  {
90  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
91  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
92 
93  registeredProcesses = new List<IProcess>();
94  cancellationTokenSource = new CancellationTokenSource();
95  }
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
static List<IntPtr> Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.GetAllChildHandles (IntPtr main)
+
+staticprivate
+
+ +

Definition at line 66 of file WindowsNetworkPromptReaper.cs.

+ +

References Tgstation.Server.Host.NativeMethods.EnumChildWindows(), and Tgstation.Server.Host.NativeMethods.EnumWindowProc().

+
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  return childHandles;
81  }
+
+
+
+ +
+
+ + + + + + + + +
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 186 of file WindowsNetworkPromptReaper.cs.

+ +

References Tgstation.Server.Host.Core.IProcess.Id, and Tgstation.Server.Host.Core.IProcessBase.Lifetime.

+
187  {
188  if (process == null)
189  throw new ArgumentNullException(nameof(process));
190 
191  lock (registeredProcesses)
192  {
193  if (registeredProcesses.Contains(process))
194  throw new InvalidOperationException("This process has already been registered for network prompt reaping!");
195  logger.LogTrace("Registering process {0}...", process.Id);
196  registeredProcesses.Add(process);
197  }
198 
199  process.Lifetime.ContinueWith(x =>
200  {
201  logger.LogTrace("Unregistering process {0}...", process.Id);
202  lock (registeredProcesses)
203  registeredProcesses.Remove(process);
204  }, TaskScheduler.Current);
205  }
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
+
int Id
The IProcess&#39; ID
Definition: IProcess.cs:14
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 100 of file WindowsNetworkPromptReaper.cs.

+ +

References Tgstation.Server.Host.NativeMethods.FindWindow(), Tgstation.Server.Host.NativeMethods.GetWindowText(), Tgstation.Server.Host.NativeMethods.GetWindowThreadProcessId(), and Tgstation.Server.Host.NativeMethods.SendMessage().

+
101  {
102  logger.LogDebug("Starting network prompt reaper...");
103  try
104  {
105  while (!cancellationToken.IsCancellationRequested)
106  {
107  await asyncDelayer.Delay(TimeSpan.FromMilliseconds(RecheckDelayMs), cancellationToken).ConfigureAwait(false);
108 
109  IntPtr window;
110  int processId;
111  lock (registeredProcesses)
112  {
113  if (registeredProcesses.Count == 0)
114  continue;
115 
116  window = NativeMethods.FindWindow(null, "Network Accessibility");
117  if (window == IntPtr.Zero)
118  continue;
119 
120  //found a bitch
121  var threadId = NativeMethods.GetWindowThreadProcessId(window, out processId);
122  if (!registeredProcesses.Any(x => x.Id == processId))
123  //not our bitch
124  continue;
125  }
126  logger.LogTrace("Identified \"Network Accessibility\" window in owned process {0}", processId);
127 
128  var found = false;
129  foreach (var I in GetAllChildHandles(window))
130  {
131  const int MaxLength = 10;
132  var stringBuilder = new StringBuilder(MaxLength + 1);
133 
134  if (NativeMethods.GetWindowText(I, stringBuilder, MaxLength) == 0)
135  {
136  logger.LogWarning("Error calling GetWindowText! Exception: {0}", new Win32Exception());
137  continue;
138  }
139 
140  var windowText = stringBuilder.ToString();
141  if (windowText == "Yes")
142  {
143  //smash_button_meme.jpg
144  logger.LogTrace("Sending \"Yes\" button clicks...");
145  for (var J = 0; J < SendMessageCount; ++J)
146  {
147  const int BM_CLICK = 0x00F5;
148  var result = NativeMethods.SendMessage(I, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
149  }
150  found = true;
151  break;
152  }
153  }
154 
155  if (!found)
156  logger.LogDebug("Unable to find \"Yes\" button for \"Network Accessibility\" window in owned process {0}!", processId);
157  }
158  }
159  catch (OperationCanceledException)
160  {
161  logger.LogTrace("Cancelled!");
162  }
163  finally
164  {
165  logger.LogDebug("Exiting network prompt reaper...");
166  }
167  }
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
+ +
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 170 of file WindowsNetworkPromptReaper.cs.

+
171  {
173  return Task.CompletedTask;
174  }
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for the WindowsNetworkPromptReaper
+
Task runTask
The Task representing the lifetime of the WindowsNetworkPromptReaper
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 177 of file WindowsNetworkPromptReaper.cs.

+
178  {
179  logger.LogTrace("Stopping network prompt reaper...");
180  cancellationTokenSource.Cancel();
181  await runTask.ConfigureAwait(false);
182  registeredProcesses.Clear();
183  }
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the WindowsNetworkPromptReaper

+ +

Definition at line 31 of file WindowsNetworkPromptReaper.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.cancellationTokenSource
+
+private
+
+ +

The CancellationTokenSource for the WindowsNetworkPromptReaper

+ +

Definition at line 41 of file WindowsNetworkPromptReaper.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<WindowsNetworkPromptReaper> Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger
+
+private
+
+ +

The ILogger for the WindowsNetworkPromptReaper

+ +

Definition at line 36 of file WindowsNetworkPromptReaper.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly List<IProcess> Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.registeredProcesses
+
+private
+
+ +

The list of IProcesss registered

+ +

Definition at line 46 of file WindowsNetworkPromptReaper.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.runTask
+
+private
+
+ +

The Task representing the lifetime of the WindowsNetworkPromptReaper

+ +

Definition at line 51 of file WindowsNetworkPromptReaper.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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_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..e9f0cafcc7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration-members.html @@ -0,0 +1,115 @@ + + + + + + +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..971acbad51 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html @@ -0,0 +1,295 @@ + + + + + + +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

+ +
+
+ + + + +
const string Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section = "Database"
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
DatabaseType Tgstation.Server.Host.Configuration.DatabaseConfiguration.DatabaseType
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >.Initialize().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Models.MySqlDatabaseContext.OnConfiguring().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

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..fb0a9c5491 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration-members.html @@ -0,0 +1,116 @@ + + + + + + +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..22dc1f5bd2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html @@ -0,0 +1,324 @@ + + + + + + +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 [get, set]
 The minimum Microsoft.Extensions.Logging.LogLevel to display in logs More...
 
LogLevel MicrosoftLogLevel = DefaultLogLevel [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

+ +
+
+ + + + + +
+ + + + +
const LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.DefaultLogLevel = LogLevel.Debug
+
+private
+
+ +

Default value for LogLevel

+ +

Definition at line 20 of file FileLoggingConfiguration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.DefaultMicrosoftLogLevel = LogLevel.Warning
+
+private
+
+ +

Default value for MicrosoftLogLevel

+ +

Definition at line 25 of file FileLoggingConfiguration.cs.

+ +
+
+ +
+
+ + + + +
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.Application.ConfigureServices(), and Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Directory
+
+getset
+
+ +

Where log files are stored

+ +

Definition at line 30 of file FileLoggingConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Disable
+
+getset
+
+ +

If file logging is disabled

+ +

Definition at line 35 of file FileLoggingConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +
+
+ + + + + +
+ + + + +
LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.LogLevel
+
+getset
+
+ +

The minimum Microsoft.Extensions.Logging.LogLevel to display in logs

+ +

Definition at line 41 of file FileLoggingConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +
+
+ + + + + +
+ + + + +
LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.MicrosoftLogLevel = DefaultLogLevel
+
+getset
+
+ +

The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources

+ +

Definition at line 48 of file FileLoggingConfiguration.cs.

+ +

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..cc470aab16 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration-members.html @@ -0,0 +1,116 @@ + + + + + + +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..929e44e16f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html @@ -0,0 +1,318 @@ + + + + + + +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 [get, set]
 Minimum length of database user passwords More...
 
string GitHubAccessToken = DefaultMinimumPasswordLength [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 [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...
 
+ + + + + + + +

+Private Attributes

const uint DefaultMinimumPasswordLength = 15
 The default value for MinimumPasswordLength More...
 
const int DefaultByondTopicTimeout = 5000
 The default value for ByondTopicTimeout More...
 
+

Detailed Description

+

General configuration options

+ +

Definition at line 9 of file GeneralConfiguration.cs.

+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Configuration.GeneralConfiguration.DefaultByondTopicTimeout = 5000
+
+private
+
+ +

The default value for ByondTopicTimeout

+ +

Definition at line 24 of file GeneralConfiguration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const uint Tgstation.Server.Host.Configuration.GeneralConfiguration.DefaultMinimumPasswordLength = 15
+
+private
+
+ +

The default value for MinimumPasswordLength

+ +

Definition at line 19 of file GeneralConfiguration.cs.

+ +
+
+ +
+
+ + + + +
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.Application.ConfigureServices(), and Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Configuration.GeneralConfiguration.ByondTopicTimeout
+
+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 45 of file GeneralConfiguration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.GeneralConfiguration.GitHubAccessToken = DefaultMinimumPasswordLength
+
+getset
+
+ +

A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes

+ +

Definition at line 34 of file GeneralConfiguration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
uint Tgstation.Server.Host.Configuration.GeneralConfiguration.MinimumPasswordLength
+
+getset
+
+ +

Minimum length of database user passwords

+ +

Definition at line 29 of file GeneralConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.ConfigureGeneral().

+ +
+
+ +
+
+ + + + + +
+ + + + +
SetupWizardMode Tgstation.Server.Host.Configuration.GeneralConfiguration.SetupWizardMode
+
+getset
+
+ +

The SetupWizardMode

+ +

Definition at line 40 of file GeneralConfiguration.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_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..df6827b038 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration-members.html @@ -0,0 +1,116 @@ + + + + + + +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..a5cde1f481 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html @@ -0,0 +1,316 @@ + + + + + + +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 [get, set]
 The Octokit.Repository.Id of the tgstation-server fork to recieve updates from More...
 
string GitTagPrefix = DefaultGitHubRepositoryId [get, set]
 Prefix before the System.Version of TGS published in git tags More...
 
string UpdatePackageAssetName = DefaultGitTagPrefix [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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Configuration.UpdatesConfiguration.DefaultUpdatePackageAssetName = "ServerUpdatePackage.zip"
+
+private
+
+ +

The default value of UpdatePackageAssetName

+ +

Definition at line 26 of file UpdatesConfiguration.cs.

+ +
+
+ +
+
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitHubRepositoryId
+
+getset
+
+ +

The Octokit.Repository.Id of the tgstation-server fork to recieve updates from

+ +

Definition at line 31 of file UpdatesConfiguration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitTagPrefix = DefaultGitHubRepositoryId
+
+getset
+
+ +

Prefix before the System.Version of TGS published in git tags

+ +

Definition at line 36 of file UpdatesConfiguration.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.UpdatesConfiguration.UpdatePackageAssetName = DefaultGitTagPrefix
+
+getset
+
+ +

Asset package containing the new Host assembly in zip form

+ +

Definition at line 41 of file UpdatesConfiguration.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_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..8839c9b749 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program-members.html @@ -0,0 +1,109 @@ + + + + + + +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.

+ +
+ + + + 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..36553289fd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html @@ -0,0 +1,118 @@ + + + + + + +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...

+

Detailed Description

+

Contains the entrypoint for the application

+ +

Definition at line 13 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_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..e13a6485f3 --- /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,110 @@ + + + + + + +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..a7f0c22394 --- /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,139 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+
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..f5224a2a01 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller-members.html @@ -0,0 +1,130 @@ + + + + + + +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
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..5273e7440a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html @@ -0,0 +1,668 @@ + + + + + + +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 ()
 
- 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)
 
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 29 of file AdministrationController.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 83 of file AdministrationController.cs.

+
83  : base(databaseContext, authenticationContextFactory, logger, false)
84  {
85  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
86  this.serverUpdater = serverUpdater ?? throw new ArgumentNullException(nameof(serverUpdater));
87  this.application = application ?? throw new ArgumentNullException(nameof(application));
88  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
89  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
90  updatesConfiguration = updatesConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(updatesConfigurationOptions));
91  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
92  }
readonly UpdatesConfiguration updatesConfiguration
The UpdatesConfiguration for the AdministrationController
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the AdministrationController
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.AdministrationController.Delete ()
+
+ +

+ +

Definition at line 206 of file AdministrationController.cs.

+
207  {
208  try
209  {
211  {
212  Logger.LogDebug("Restart request failed due to lack of host watchdog!");
213  return UnprocessableEntity(new ErrorMessage
214  {
216  });
217  }
218  await serverUpdater.Restart().ConfigureAwait(false);
219  return Ok();
220  }
221  catch (InvalidOperationException)
222  {
223  return StatusCode((int)HttpStatusCode.ServiceUnavailable);
224  }
225  }
bool WatchdogPresent
if live updates are supported, . ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this ...
+ + +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
readonly IServerControl serverUpdater
The IServerControl for the AdministrationController
+
+
+
+ +
+
+ + + + + +
+ + + + + + + +
IGitHubClient Tgstation.Server.Host.Controllers.AdministrationController.GetGitHubClient ()
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
StatusCodeResult Tgstation.Server.Host.Controllers.AdministrationController.RateLimit (RateLimitExceededException exception)
+
+private
+
+ +

Definition at line 94 of file AdministrationController.cs.

+
95  {
96  Logger.LogWarning("Exceeded GitHub rate limit! Exception {0}", exception);
97  var secondsString = Math.Ceiling((exception.Reset - DateTimeOffset.Now).TotalSeconds).ToString(CultureInfo.InvariantCulture);
98  Response.Headers.Add("Retry-After", new StringValues(secondsString));
99  return StatusCode(429);
100  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 106 of file AdministrationController.cs.

+
107  {
108  try
109  {
110  Version greatestVersion = null;
111  Uri repoUrl = null;
112  try
113  {
114  var gitHubClient = GetGitHubClient();
115  var repositoryTask = gitHubClient.Repository.Get(updatesConfiguration.GitHubRepositoryId);
116  var releases = (await gitHubClient.Repository.Release.GetAll(updatesConfiguration.GitHubRepositoryId).ConfigureAwait(false)).Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
117 
118  foreach (var I in releases)
119  if (Version.TryParse(I.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version)
120  && version.Major == application.Version.Major
121  && (greatestVersion == null || version > greatestVersion))
122  greatestVersion = version;
123  repoUrl = new Uri((await repositoryTask.ConfigureAwait(false)).HtmlUrl);
124  }
125  catch (NotFoundException e)
126  {
127  Logger.LogWarning("Not found exception while retrieving upstream repository info: {0}", e);
128  }
129  return Json(new Administration
130  {
131  LatestVersion = greatestVersion,
132  TrackedRepositoryUrl = repoUrl,
133  WindowsHost = platformIdentifier.IsWindows
134  });
135  }
136  catch (RateLimitExceededException e)
137  {
138  return RateLimit(e);
139  }
140  catch (ApiException e)
141  {
142  Logger.LogWarning(OctokitException, e);
143  return StatusCode((int)HttpStatusCode.FailedDependency);
144  }
145  }
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)
+ +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.AdministrationController.Update ([FromBody] Administration model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 149 of file AdministrationController.cs.

+
150  {
151  if (model == null)
152  throw new ArgumentNullException(nameof(model));
153 
154  if (model.NewVersion == null)
155  return BadRequest(new ErrorMessage { Message = "Missing new version!" });
156 
157  if (model.NewVersion.Major != application.Version.Major)
158  return BadRequest(new ErrorMessage { Message = "Cannot update to a different suite version!" });
159 
161  return UnprocessableEntity(new ErrorMessage
162  {
164  });
165 
166  Logger.LogDebug("Looking for GitHub releases version {0}...", model.NewVersion);
167  IEnumerable<Release> releases;
168  try
169  {
170  var gitHubClient = GetGitHubClient();
171  releases = (await gitHubClient.Repository.Release.GetAll(updatesConfiguration.GitHubRepositoryId).ConfigureAwait(false)).Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
172  cancellationToken.ThrowIfCancellationRequested();
173  }
174  catch (RateLimitExceededException e)
175  {
176  return RateLimit(e);
177  }
178  catch (ApiException e)
179  {
180  Logger.LogWarning(OctokitException, e);
181  return StatusCode((int)HttpStatusCode.FailedDependency);
182  }
183 
184  Logger.LogTrace("Release query complete!");
185  foreach (var release in releases)
186  if (Version.TryParse(release.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version) && version == model.NewVersion)
187  {
188  var asset = release.Assets.Where(x => x.Name == updatesConfiguration.UpdatePackageAssetName).FirstOrDefault();
189  if (asset == default)
190  continue;
191 
192  if (!serverUpdater.ApplyUpdate(version, new Uri(asset.BrowserDownloadUrl), ioManager))
193  return Conflict(new ErrorMessage
194  {
195  Message = "An update operation is already in progress!"
196  });
197  return Accepted(); //gtfo of here before all the cancellation tokens fire
198  }
199 
200  return StatusCode((int)HttpStatusCode.Gone);
201  }
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
+
bool WatchdogPresent
if live updates are supported, . ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this ...
+
readonly IApplication application
The IApplication for the AdministrationController
+
StatusCodeResult RateLimit(RateLimitExceededException exception)
+ + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Controllers.AdministrationController.application
+
+private
+
+ +

The IApplication for the AdministrationController

+ +

Definition at line 48 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Controllers.AdministrationController.generalConfiguration
+
+private
+
+ +

The GeneralConfiguration for the AdministrationController

+ +

Definition at line 68 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Controllers.AdministrationController.gitHubClientFactory
+
+private
+
+ +

The IGitHubClientFactory for the AdministrationController

+ +

Definition at line 38 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Controllers.AdministrationController.ioManager
+
+private
+
+ +

The IIOManager for the AdministrationController

+ +

Definition at line 53 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Controllers.AdministrationController.OctokitException = "Bad GitHub API response, check configuration! Exception: {0}"
+
+private
+
+ +

Definition at line 33 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Controllers.AdministrationController.platformIdentifier
+
+private
+
+ +

The IPlatformIdentifier for the AdministrationController

+ +

Definition at line 58 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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
+
+ +

Definition at line 31 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IServerControl Tgstation.Server.Host.Controllers.AdministrationController.serverUpdater
+
+private
+
+ +

The IServerControl for the AdministrationController

+ +

Definition at line 43 of file AdministrationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly UpdatesConfiguration Tgstation.Server.Host.Controllers.AdministrationController.updatesConfiguration
+
+private
+
+ +

The UpdatesConfiguration for the AdministrationController

+ +

Definition at line 63 of file AdministrationController.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_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..baac9a7a29 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller-members.html @@ -0,0 +1,117 @@ + + + + + + +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..fb99004edf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html @@ -0,0 +1,420 @@ + + + + + + +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)
 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...
 
+

Detailed Description

+

A Controller for API functions

+ +

Definition at line 22 of file ApiController.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.ApiController.ApiController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
ILogger logger,
bool requireInstance 
)
+
+ +

Construct an ApiController

+
Parameters
+ + + + + +
databaseContextThe value of DatabaseContext
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
loggerThe value of Logger
requireInstanceThe value of requireInstance
+
+
+ +

Definition at line 61 of file ApiController.cs.

+ +

References Tgstation.Server.Host.Security.IAuthenticationContextFactory.CurrentAuthenticationContext, and Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser.

+
62  {
63  DatabaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
64  if (authenticationContextFactory == null)
65  throw new ArgumentNullException(nameof(authenticationContextFactory));
66  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
67  AuthenticationContext = authenticationContextFactory.CurrentAuthenticationContext;
70  }
+ + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync (ActionExecutingContext context,
ActionExecutionDelegate next 
)
+
+ +

+ +

Definition at line 73 of file ApiController.cs.

+ +

References 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.Api.Models.ErrorMessage.Message, Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Api.ApiHeaders.UserAgent.

+
74  {
75  //ALL valid token and login requests that match a route go through this function
76  //404 is returned before
77 
78  if (AuthenticationContext != null && AuthenticationContext.User == null)
79  {
80  //valid token, expired password
81  await Unauthorized().ExecuteResultAsync(context).ConfigureAwait(false);
82  return;
83  }
84 
85  //validate the headers
86  try
87  {
88  ApiHeaders = new ApiHeaders(Request.GetTypedHeaders());
89 
90  if (!ApiHeaders.Compatible())
91  {
92  await StatusCode((int)HttpStatusCode.UpgradeRequired, new ErrorMessage
93  {
94  Message = "Provided API version is incompatible with server version!"
95  }).ExecuteResultAsync(context).ConfigureAwait(false);
96  return;
97  }
98 
99  if (requireInstance)
100  {
101  if (!ApiHeaders.InstanceId.HasValue)
102  {
103  await BadRequest(new ErrorMessage { Message = "Missing Instance header!" }).ExecuteResultAsync(context).ConfigureAwait(false);
104  return;
105  }
107  {
108  //accessing an instance they don't have access to or one that's disabled
109  await Forbid().ExecuteResultAsync(context).ConfigureAwait(false);
110  return;
111  }
112  }
113  }
114  catch (InvalidOperationException e)
115  {
116  await BadRequest(new ErrorMessage { Message = e.Message }).ExecuteResultAsync(context).ConfigureAwait(false);
117  return;
118  }
119 
120  if (ModelState?.IsValid == false)
121  {
122  var errorMessages = ModelState.SelectMany(x => x.Value.Errors).Select(x => x.ErrorMessage).ToList();
123  //HACK
124  //do some fuckery to remove RequiredAttribute errors
125  for (var I = 0; I < errorMessages.Count; ++I)
126  {
127  var message = errorMessages[I];
128  if (message.StartsWith("The ", StringComparison.Ordinal) && message.EndsWith(" field is required.", StringComparison.Ordinal))
129  {
130  errorMessages.RemoveAt(I);
131  --I;
132  }
133  }
134  if (errorMessages.Count > 0)
135  {
136  await BadRequest(new ErrorMessage { Message = String.Join(Environment.NewLine, errorMessages) }).ExecuteResultAsync(context).ConfigureAwait(false);
137  return;
138  }
139  }
140 
141  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.UserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId);
142 
143  try
144  {
145  await base.OnActionExecutionAsync(context, next).ConfigureAwait(false);
146  }
147  catch (OperationCanceledException e)
148  {
149  Logger.LogDebug("Request cancelled! Exception: {0}", e);
150  throw;
151  }
152  }
+
Version ApiVersion
The client&#39;s API version
Definition: ApiHeaders.cs:71
+
bool Compatible()
Checks if the ApiVersion is compatible with Version
+
ProductHeaderValue UserAgent
The client&#39;s user agent
Definition: ApiHeaders.cs:66
+
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
+ +
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 ...
+
long InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly bool Tgstation.Server.Host.Controllers.ApiController.requireInstance
+
+private
+
+ +

If IAuthenticationContext.InstanceUser permissions are required to access the ApiController

+ +

Definition at line 52 of file ApiController.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ApiHeaders Tgstation.Server.Host.Controllers.ApiController.ApiHeaders
+
+getprivate setprotected
+
+ +

The ApiHeaders for the operation

+ +

Definition at line 27 of file ApiController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IAuthenticationContext Tgstation.Server.Host.Controllers.ApiController.AuthenticationContext
+
+getprotected
+
+ +

The IAuthenticationContext for the operation

+ +

Definition at line 37 of file ApiController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDatabaseContext Tgstation.Server.Host.Controllers.ApiController.DatabaseContext
+
+getprotected
+
+ +

The IDatabaseContext for the operation

+ +

Definition at line 32 of file ApiController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Models.Instance Tgstation.Server.Host.Controllers.ApiController.Instance
+
+getprotected
+
+ +

The Instance for the operation

+ +

Definition at line 47 of file ApiController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ILogger Tgstation.Server.Host.Controllers.ApiController.Logger
+
+getprotected
+
+ +

The ILogger for the ApiController

+ +

Definition at line 42 of file ApiController.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_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..7a5d37da5d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller-members.html @@ -0,0 +1,120 @@ + + + + + + +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..bb5687c26f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html @@ -0,0 +1,382 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Rights.List, and Tgstation.Server.Api.Rights.Read.

+
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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 >.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 >.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.User.Id, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
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  //run the install through the job manager
90  var job = new Models.Job
91  {
92  Description = String.Format(CultureInfo.InvariantCulture, "Install BYOND version {0}", installingVersion),
93  StartedBy = AuthenticationContext.User,
94  CancelRightsType = RightsType.Byond,
95  CancelRight = (ulong)ByondRights.CancelInstall,
97  };
98  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => byondManager.ChangeVersion(installingVersion, ct), cancellationToken).ConfigureAwait(false);
99  result.InstallJob = job.ToApi();
100  }
101  if ((AuthenticationContext.GetRight(RightsType.Byond) & (ulong)ByondRights.ReadActive) != 0)
102  result.Version = byondManager.ActiveVersion;
103  return result.InstallJob != null ? (IActionResult)Accepted(result) : Json(result);
104  }
+
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
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.ByondController.instanceManager
+
+private
+
+ +

The IInstanceManager for the ByondController

+ +

Definition at line 27 of file ByondController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.ByondController.jobManager
+
+private
+
+ +

The IJobManager for the ByondController

+ +

Definition at line 32 of file ByondController.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_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..104a69c2a5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller-members.html @@ -0,0 +1,121 @@ + + + + + + +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..b6d969e745 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html @@ -0,0 +1,513 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Rights.List, Tgstation.Server.Api.Models.ErrorMessage.Message, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+
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  return StatusCode((int)HttpStatusCode.Created, dbModel.ToApi());
129  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 133 of file ChatController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots.

+
134  {
135  var instance = instanceManager.GetInstance(Instance);
136  await Task.WhenAll(instance.Chat.DeleteConnection(id, cancellationToken), DatabaseContext.ChatBots.Where(x => x.Id == id).DeleteAsync(cancellationToken)).ConfigureAwait(false);
137 
138  return Ok();
139  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 160 of file ChatController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, and Tgstation.Server.Host.Security.AuthenticationContext.GetRight().

+
161  {
162  var query = DatabaseContext.ChatBots.Where(x => x.Id == id).Include(x => x.Channels);
163 
164  var results = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
165  if (results == default)
166  return StatusCode((int)HttpStatusCode.Gone);
167 
168  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
169 
170  if (!connectionStrings)
171  results.ConnectionString = null;
172 
173  return Json(results.ToApi());
174  }
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 143 of file ChatController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), and Tgstation.Server.Api.Models.Instance.Id.

+
144  {
145  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id).Include(x => x.Channels);
146 
147  var results = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
148 
149  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
150 
151  if (!connectionStrings)
152  foreach (var I in results)
153  I.ConnectionString = null;
154 
155  return Json(results.Select(x => x.ToApi()));
156  }
+
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ChatController.Update ([FromBody] Api.Models.ChatBot model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 178 of file ChatController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatChannels, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+
179  {
180  if (model == null)
181  throw new ArgumentNullException(nameof(model));
182 
183  if (model.Provider.HasValue && !model.ValidateProviderChannelTypes())
184  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
185 
186  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id && x.Id == model.Id).Include(x => x.Channels);
187 
188  var current = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
189 
190  if (current == default)
191  return StatusCode((int)HttpStatusCode.Gone);
192 
193  var userRights = (ChatBotRights)AuthenticationContext.GetRight(RightsType.ChatBots);
194 
195  bool anySettingsModified = false;
196 
197  bool CheckModified<T>(Expression<Func<Api.Models.Internal.ChatBot, T>> expression, ChatBotRights requiredRight)
198  {
199  var memberSelectorExpression = (MemberExpression)expression.Body;
200  var property = (PropertyInfo)memberSelectorExpression.Member;
201 
202  var newVal = property.GetValue(model);
203  if (newVal == null)
204  return false;
205  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
206  return true;
207 
208  property.SetValue(current, newVal);
209  anySettingsModified = true;
210  return false;
211  };
212 
213  var oldProvider = current.Provider;
214 
215  if (CheckModified(x => x.ConnectionString, ChatBotRights.WriteConnectionString)
216  || CheckModified(x => x.Enabled, ChatBotRights.WriteEnabled)
217  || CheckModified(x => x.Name, ChatBotRights.WriteName)
218  || CheckModified(x => x.Provider, ChatBotRights.WriteProvider)
219  || (model.Channels != null && !userRights.HasFlag(ChatBotRights.WriteChannels)))
220  return Forbid();
221 
222  var hasChannels = model.Channels != null;
223  if (hasChannels || (model.Provider.HasValue && model.Provider != oldProvider))
224  {
225  DatabaseContext.ChatChannels.RemoveRange(current.Channels);
226  if (hasChannels)
227  {
228  var dbChannels = model.Channels.Select(x => ConvertApiChatChannel(x)).ToList();
229  DatabaseContext.ChatChannels.AddRange(dbChannels);
230  current.Channels = dbChannels;
231  }
232  else
233  current.Channels.Clear();
234  }
235 
236  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
237 
239 
240  if (anySettingsModified)
241  //have to rebuild the thing first
242  await chat.ChangeSettings(current, cancellationToken).ConfigureAwait(false);
243 
244  if (model.Channels != null || anySettingsModified)
245  await chat.ChangeChannels(current.Id, current.Channels, cancellationToken).ConfigureAwait(false);
246 
247  if (userRights.HasFlag(ChatBotRights.Read))
248  {
249  if (!userRights.HasFlag(ChatBotRights.ReadConnectionString))
250  current.ConnectionString = null;
251  return Json(current.ToApi());
252  }
253  return Ok();
254  }
+ +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.ChatController.instanceManager
+
+private
+
+ +

The IInstanceManager for the ChatController

+ +

Definition at line 31 of file ChatController.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_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..4f84389531 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html @@ -0,0 +1,595 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.Create ([FromBody] ConfigurationFile model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 174 of file ConfigurationController.cs.

+
175  {
176  if (model == null)
177  throw new ArgumentNullException(nameof(model));
178 
179  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
180  return Forbid();
181 
182  try
183  {
184  model.IsDirectory = true;
185  return await instanceManager.GetInstance(Instance).Configuration.CreateDirectory(model.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Json(model) : StatusCode((int)HttpStatusCode.Created, model);
186  }
187  catch (NotImplementedException)
188  {
189  return StatusCode((int)HttpStatusCode.NotImplemented);
190  }
191  catch (UnauthorizedAccessException)
192  {
193  return Forbid();
194  }
195  }
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 StaticFiles.IConfiguration for the IInstance
Definition: IInstance.cs:42
+
Metadata about a server instance
Definition: Instance.cs:9
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 205 of file ConfigurationController.cs.

+
206  {
207  if (directory == null)
208  throw new ArgumentNullException(nameof(directory));
209 
210  if (ForbidDueToModeConflicts(directory.Path, out var systemIdentity))
211  return Forbid();
212 
213  try
214  {
215  return await instanceManager.GetInstance(Instance).Configuration.DeleteDirectory(directory.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Ok() : Conflict(new ErrorMessage
216  {
217  Message = "Directory not empty!"
218  });
219  }
220  catch (NotImplementedException)
221  {
222  return StatusCode((int)HttpStatusCode.NotImplemented);
223  }
224  catch (UnauthorizedAccessException)
225  {
226  return Forbid();
227  }
228  }
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 StaticFiles.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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 145 of file ConfigurationController.cs.

+ +

References Tgstation.Server.Api.Rights.List.

+
146  {
147  if (ForbidDueToModeConflicts(directoryPath, out var systemIdentity))
148  return Forbid();
149 
150  try
151  {
152  var result = await instanceManager.GetInstance(Instance).Configuration.ListDirectory(directoryPath, systemIdentity, cancellationToken).ConfigureAwait(false);
153  if (result == null)
154  return StatusCode((int)HttpStatusCode.Gone);
155 
156  return Json(result);
157  }
158  catch (NotImplementedException)
159  {
160  return StatusCode((int)HttpStatusCode.NotImplemented);
161  }
162  catch (UnauthorizedAccessException)
163  {
164  return Forbid();
165  }
166  }
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 StaticFiles.IConfiguration for the IInstance
Definition: IInstance.cs:42
+
Metadata about a server instance
Definition: Instance.cs:9
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 110 of file ConfigurationController.cs.

+ +

References Tgstation.Server.Api.Models.ErrorMessage.Message.

+
111  {
112  if (ForbidDueToModeConflicts(filePath, out var systemIdentity))
113  return Forbid();
114 
115  try
116  {
117  var result = await instanceManager.GetInstance(Instance).Configuration.Read(filePath, systemIdentity, cancellationToken).ConfigureAwait(false);
118  if (result == null)
119  return StatusCode((int)HttpStatusCode.Gone);
120 
121  return Json(result);
122  }
123  catch (IOException e)
124  {
125  Logger.LogInformation("IOException while reading file {0}: {1}", filePath, e);
126  return Conflict(new ErrorMessage
127  {
128  Message = e.Message
129  });
130  }
131  catch (NotImplementedException)
132  {
133  return StatusCode((int)HttpStatusCode.NotImplemented);
134  }
135  }
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 StaticFiles.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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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
if a ForbidResult should be returned, otherwise
+ +

Definition at line 54 of file ConfigurationController.cs.

+ +

References Tgstation.Server.Api.Models.Instance.ConfigurationType, and Tgstation.Server.Host.Security.AuthenticationContext.SystemIdentity.

+
55  {
57  {
58  systemIdentityToUse = null;
59  return true;
60  }
61  systemIdentityToUse = Instance.ConfigurationType == ConfigurationType.SystemIdentityWrite ? AuthenticationContext.SystemIdentity : null;
62  return false;
63  }
+
ConfigurationType
The type of configuration allowed on an Instance
+
readonly IIOManager ioManager
The IIOManager for the ConfigurationController
+ +
Metadata about a server instance
Definition: Instance.cs:9
+
bool PathContainsParentAccess(string path)
Check if a path contains the &#39;..&#39; parent directory accessor
+
ConfigurationType ConfigurationType
If ConfigurationFile can be used on the Instance
Definition: Instance.cs:38
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 >.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.Update ([FromBody] ConfigurationFile model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 67 of file ConfigurationController.cs.

+ +

References Tgstation.Server.Api.Routes.File, and Tgstation.Server.Api.Models.ErrorMessage.Message.

+
68  {
69  if (model == null)
70  throw new ArgumentNullException(nameof(model));
71  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
72  return Forbid();
73 
75  try
76  {
77  var newFile = await config.Write(model.Path, systemIdentity, model.Content, model.LastReadHash, cancellationToken).ConfigureAwait(false);
78  if (newFile == null)
79  return Conflict(new ErrorMessage
80  {
81  Message = "This file has been updated since you last viewed it!"
82  });
83 
84  newFile.Content = null;
85 
86  return model.LastReadHash == null ? (IActionResult)StatusCode((int)HttpStatusCode.Created, newFile) : Json(newFile);
87  }
88  catch(IOException e)
89  {
90  Logger.LogInformation("IOException while updating file {0}: {1}", model.Path, e);
91  return Conflict(new ErrorMessage
92  {
93  Message = e.Message
94  });
95  }
96  catch (NotImplementedException)
97  {
98  return StatusCode((int)HttpStatusCode.NotImplemented);
99  }
100  }
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&#39;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 StaticFiles.IConfiguration for the IInstance
Definition: IInstance.cs:42
+
byte[] Content
The content of the ConfigurationFile. Will be if AccessDenied is or during listing and write operat...
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager
+
+private
+
+ +

The IInstanceManager for the ConfigurationController

+ +

Definition at line 27 of file ConfigurationController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Controllers.ConfigurationController.ioManager
+
+private
+
+ +

The IIOManager for the ConfigurationController

+ +

Definition at line 32 of file ConfigurationController.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_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..ecc18fa253 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html @@ -0,0 +1,541 @@ + + + + + + +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)
 
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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 45 of file DreamDaemonController.cs.

+
45  : base(databaseContext, authenticationContextFactory, logger, true)
46  {
47  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
48  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
49  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Create ([FromBody] DreamDaemon model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 53 of file DreamDaemonController.cs.

+ +

References Tgstation.Server.Api.Rights.Read, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
54  {
55  //alias for launching DD
56  var instance = instanceManager.GetInstance(Instance);
57 
58  if (instance.Watchdog.Running)
59  return StatusCode((int)HttpStatusCode.Gone);
60 
61  var job = new Models.Job
62  {
63  Description = "Launch DreamDaemon",
64  CancelRight = (ulong)DreamDaemonRights.Shutdown,
65  CancelRightsType = RightsType.DreamDaemon,
67  StartedBy = AuthenticationContext.User
68  };
69  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, innerCt) => instance.Watchdog.Launch(innerCt), cancellationToken).ConfigureAwait(false);
70  return Accepted(job.ToApi());
71  }
+
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
+ +
+
+
+ +
+
+ + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Delete (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 132 of file DreamDaemonController.cs.

+
133  {
134  //alias for stopping DD
135  var instance = instanceManager.GetInstance(Instance);
136  await instance.Watchdog.Terminate(false, cancellationToken).ConfigureAwait(false);
137  return Ok();
138  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 >.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 83 of file DreamDaemonController.cs.

+ +

References Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.AllowWebClient, Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.AutoStart, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, 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, and Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.StartupTimeout.

+
84  {
85  var instance = instanceManager.GetInstance(Instance);
86  var dd = instance.Watchdog;
87 
88  var metadata = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadMetadata) != 0;
89  var revision = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadRevision) != 0;
90 
91  if (settings == null)
92  {
93  settings = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
94  if (settings == default)
95  return StatusCode((int)HttpStatusCode.Gone);
96  }
97 
98  var result = new DreamDaemon();
99  if (metadata)
100  {
101  var alphaActive = dd.AlphaIsActive;
102  var llp = dd.LastLaunchParameters;
103  var rstate = dd.RebootState;
104  result.AutoStart = settings.AutoStart;
105  result.CurrentPort = alphaActive ? llp?.PrimaryPort : llp?.SecondaryPort;
106  result.CurrentSecurity = llp?.SecurityLevel;
107  result.CurrentAllowWebclient = llp?.AllowWebClient;
108  result.PrimaryPort = settings.PrimaryPort;
109  result.AllowWebClient = settings.AllowWebClient;
110  result.Running = dd.Running;
111  result.SecondaryPort = settings.SecondaryPort;
112  result.SecurityLevel = settings.SecurityLevel;
113  result.SoftRestart = rstate == RebootState.Restart;
114  result.SoftShutdown = rstate == RebootState.Shutdown;
115  result.StartupTimeout = settings.StartupTimeout;
116  };
117 
118  if (revision)
119  {
120  var latestCompileJob = instance.LatestCompileJob();
121  result.ActiveCompileJob = (dd.ActiveCompileJob ?? latestCompileJob)?.ToApi();
122  if (latestCompileJob?.Id != result.ActiveCompileJob?.Id)
123  result.StagedCompileJob = latestCompileJob?.ToApi();
124  }
125 
126  return Json(result);
127  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
bool AutoStart
If DreamDaemon starts when it&#39;s Instance starts
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
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&#39;s DreamDaemon game server. Create action starts the server...
Definition: DreamDaemon.cs:8
+
ushort PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+ +
bool AllowWebClient
If the BYOND web client can be used to connect to the game server
+
+
+
+ +
+
+ + + + + + + + +
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 215 of file DreamDaemonController.cs.

+ +

References Tgstation.Server.Host.Security.AuthenticationContext.User.

+
216  {
217  var job = new Models.Job
218  {
219  Instance = Instance,
220  CancelRightsType = RightsType.DreamDaemon,
221  CancelRight = (ulong)DreamDaemonRights.Shutdown,
222  StartedBy = AuthenticationContext.User,
223  Description = "Restart Watchdog"
224  };
225 
227 
228  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => watchdog.Restart(false, ct), cancellationToken).ConfigureAwait(false);
229  return Accepted(job.ToApi());
230  }
+
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
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Update ([FromBody] DreamDaemon model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 142 of file DreamDaemonController.cs.

+ +

References Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+
143  {
144  if (model == null)
145  throw new ArgumentNullException(nameof(model));
146 
147  if (model.PrimaryPort == 0)
148  return BadRequest(new ErrorMessage { Message = "Primary port cannot be 0!" });
149 
150  if (model.SecurityLevel == DreamDaemonSecurity.Ultrasafe)
151  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
152 
153  //alias for changing DD settings
154  var current = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
155 
156  if (current == default)
157  return StatusCode((int)HttpStatusCode.Gone);
158 
159  var userRights = (DreamDaemonRights)AuthenticationContext.GetRight(RightsType.DreamDaemon);
160 
161  bool CheckModified<T>(Expression<Func<Api.Models.Internal.DreamDaemonSettings, T>> expression, DreamDaemonRights requiredRight)
162  {
163  var memberSelectorExpression = (MemberExpression)expression.Body;
164  var property = (PropertyInfo)memberSelectorExpression.Member;
165 
166  var newVal = property.GetValue(model);
167  if (newVal == null)
168  return false;
169  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
170  return true;
171 
172  property.SetValue(current, newVal);
173  return false;
174  };
175 
176  var oldSoftRestart = current.SoftRestart;
177  var oldSoftShutdown = current.SoftShutdown;
178 
179  if (CheckModified(x => x.AllowWebClient, DreamDaemonRights.SetWebClient)
180  || CheckModified(x => x.AutoStart, DreamDaemonRights.SetAutoStart)
181  || CheckModified(x => x.PrimaryPort, DreamDaemonRights.SetPorts)
182  || CheckModified(x => x.SecondaryPort, DreamDaemonRights.SetPorts)
183  || CheckModified(x => x.SecurityLevel, DreamDaemonRights.SetSecurity)
184  || CheckModified(x => x.SoftRestart, DreamDaemonRights.SoftRestart)
185  || CheckModified(x => x.SoftShutdown, DreamDaemonRights.SoftShutdown)
186  || CheckModified(x => x.StartupTimeout, DreamDaemonRights.SetStartupTimeout))
187  return Forbid();
188 
189  if (current.PrimaryPort == current.SecondaryPort)
190  return BadRequest(new ErrorMessage { Message = "Primary port and secondary port cannot be the same!" });
191 
193 
194  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
195  //run this second because current may be modified by it
196  await wd.ChangeSettings(current, cancellationToken).ConfigureAwait(false);
197 
198  if (!oldSoftRestart.Value && current.SoftRestart.Value)
199  await wd.Restart(true, cancellationToken).ConfigureAwait(false);
200  else if (!oldSoftShutdown.Value && current.SoftShutdown.Value)
201  await wd.Terminate(true, cancellationToken).ConfigureAwait(false);
202  else if ((oldSoftRestart.Value && !current.SoftRestart.Value) || (oldSoftShutdown.Value && !current.SoftShutdown.Value))
203  await wd.ResetRebootState(cancellationToken).ConfigureAwait(false);
204 
205  return await ReadImpl(current, cancellationToken).ConfigureAwait(false);
206  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
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&#39;s security level
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
ushort PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager
+
+private
+
+ +

The IInstanceManager for the DreamMakerController

+ +

Definition at line 35 of file DreamDaemonController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager
+
+private
+
+ +

The IJobManager for the DreamMakerController

+ +

Definition at line 31 of file DreamDaemonController.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_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..f75a68d98f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller-members.html @@ -0,0 +1,121 @@ + + + + + + +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< Api.Models.DreamMaker >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.DreamMaker >virtual
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.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< Api.Models.DreamMaker >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamMakerControllervirtual
Update([FromBody] DreamMaker model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamMakerController
ModelController< Api.Models.DreamMaker >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.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..3c9c3bd352 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html @@ -0,0 +1,491 @@ + + + + + + +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< Api.Models.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< Api.Models.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 23 of file DreamMakerController.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 42 of file DreamMakerController.cs.

+
42  : base(databaseContext, authenticationContextFactory, logger, true)
43  {
44  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
45  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
46  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamMakerController.Create ([FromBody] DreamMaker model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 85 of file DreamMakerController.cs.

+ +

References Tgstation.Server.Host.Security.AuthenticationContext.User.

+
86  {
87  var job = new Models.Job
88  {
89  Description = "Compile active repository code",
90  StartedBy = AuthenticationContext.User,
91  CancelRightsType = RightsType.DreamMaker,
92  CancelRight = (ulong)DreamMakerRights.CancelCompile,
94  };
95  await jobManager.RegisterOperation(job, instanceManager.GetInstance(Instance).CompileProcess, cancellationToken).ConfigureAwait(false);
96  return Accepted(job.ToApi());
97  }
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.IJobManager
+
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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< Api.Models.DreamMaker >.

+ +

Definition at line 59 of file DreamMakerController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.CompileJobs, and Tgstation.Server.Api.Models.Instance.Id.

+
60  {
61  var compileJob = await DatabaseContext.CompileJobs
62  .Where(x => x.Id == id && x.Job.Instance.Id == Instance.Id)
63  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
64  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
65  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
66  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
67  if (compileJob == default)
68  return NotFound();
69  return Json(compileJob.ToApi());
70  }
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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< Api.Models.DreamMaker >.

+ +

Definition at line 74 of file DreamMakerController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.CompileJobs, and Tgstation.Server.Api.Models.Instance.Id.

+
75  {
76  var compileJobs = await DatabaseContext.CompileJobs.Where(x => x.Job.Instance.Id == Instance.Id).OrderByDescending(x => x.Job.StoppedAt).Select(x => new Api.Models.CompileJob
77  {
78  Id = x.Id
79  }).ToListAsync(cancellationToken).ConfigureAwait(false);
80  return Json(compileJobs);
81  }
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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< Api.Models.DreamMaker >.

+ +

Definition at line 50 of file DreamMakerController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DreamMakerSettings, and Tgstation.Server.Api.Models.Instance.Id.

+
51  {
52  var instance = instanceManager.GetInstance(Instance);
53  var dreamMakerSettings = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
54  return Json(dreamMakerSettings.ToApi());
55  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamMakerController.Update ([FromBody] DreamMaker model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 101 of file DreamMakerController.cs.

+ +

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.Api.Rights.Read, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+
102  {
103  if (model.ApiValidationPort == 0)
104  return BadRequest(new ErrorMessage { Message = "API Validation port cannot be 0!" });
105 
106  if (model.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
107  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
108 
109  var hostModel = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
110  if (hostModel == null)
111  return StatusCode((int)HttpStatusCode.Gone);
112 
113  if (model.ProjectName != null)
114  {
116  return Forbid();
117  if (model.ProjectName.Length == 0)
118  hostModel.ProjectName = null;
119  else
120  hostModel.ProjectName = model.ProjectName;
121  }
122 
123  if (model.ApiValidationPort.HasValue)
124  {
125  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetApiValidationPort))
126  return Forbid();
127  hostModel.ApiValidationPort = model.ApiValidationPort;
128  }
129 
130  if (model.ApiValidationSecurityLevel.HasValue)
131  {
132  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetSecurityLevel))
133  return Forbid();
134  hostModel.ApiValidationSecurityLevel = model.ApiValidationSecurityLevel;
135  }
136 
137  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
138 
139  if ((AuthenticationContext.GetRight(RightsType.DreamMaker) & (ulong)DreamMakerRights.Read) == 0)
140  return Ok();
141 
142  return await Read(cancellationToken).ConfigureAwait(false);
143  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
DbSet< DreamMakerSettings > DreamMakerSettings
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
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
+
DreamMakerRights
Rights for Models.DreamMaker
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
DreamMakerRights DreamMakerRights
The Rights.DreamMakerRights of the InstanceUser
Definition: InstanceUser.cs:39
+
override async Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
Metadata about a server instance
Definition: Instance.cs:9
+
DreamDaemonSecurity ApiValidationSecurityLevel
The DreamDaemonSecurity level used to validate the DMAPI
Definition: DreamMaker.cs:25
+
DreamDaemonSecurity
DreamDaemon&#39;s security level
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.DreamMakerController.instanceManager
+
+private
+
+ +

The IInstanceManager for the DreamMakerController

+ +

Definition at line 32 of file DreamMakerController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.DreamMakerController.jobManager
+
+private
+
+ +

The IJobManager for the DreamMakerController

+ +

Definition at line 28 of file DreamMakerController.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_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..6c513ceeff4edc0e2a153fb38f5360698f8f8d47 GIT binary patch literal 1399 zcmeAS@N?(olHy`uVBq!ia0y~yU_1k42XHV0$;H>US^z1D0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu239st7srqa#I5yHnV3}Zab^&oZY4Ja^<xoxx zUE8d>@ZOo{_kJ(Q6`b*NZF<(n$OPpxy7t>vt}rz|`1TM>j_hpPH^S_b-vxXzEK##Q ze68txYxkA2H8(qVE4;6GZ*1s!{VzvOnp^ko{BjeiE1YMZZL@rTa#yh4%AQU0--X&0 zJp62POXBk#(M_IK?VF2FcCMZ`Idrc3NgV zU2-gOx0?Co=_|uOy{VD>Y&!jKq`CEuM@Q^iuI=8PbAHeH(`yW02M?r zdB*b8ZOsX**V!(ccbVbymNRxcO&%|`^ILBF_4*u%Ig^h+YQOip<9PJSMe9n%(lcv| zjOXv4Sv-U9(vmat_Rie9Q2f*y|6?~-mtH;jCG2bdv*7o#H|^YoXSh4>Gnuz%=IzhB zuO8Uycjx?(IIG`T`^$2b-?7}%`|kG6dsTOo-7T%)hc)YC?{B-Ld{g$vg7sD({ZG~T zAFG*PmA~+s!J6B%Uc8*R*7^3U$OPFldI_Fho|i)YA6NNm(7ru%QqZI)UwI8)>rPuT zMMd_7c7j)s*Q9;^oWYZtG!ngn1mG#Bq#=}A%3Qh!!4{$c*bI)Uj&ovKfR#ILW~ znM^GKhgdomN}pcBDd5N{tk5H*>HyT)px`xw0hr_%fkrX01Ri4HSk%HP-~v?8A*4nP z1%H(dyfsxry)^IZb2)H5xIGo!D)}a0DnGF0Tjg)la$`NF8JTmh`QO{WyzN*8-(25A z>>pMM-#NxG=N>QXgIRXv#^=ono;<$ze=`FlZGTpum@|QA^~tX7&Wt;j`5)es`{m!` zefN(u-u=IJZ~uQ?>2FC_Gp=c_JAHT!^VMDUX2*`c`aN;S+H!+CuAA1H+C}-Ze?IZ# zX#m5$EA5GSKR5O|Wv4Y+zqVH2eMD_TYPG>jK393?^i9ThqGud0u2q<7#c!5ZPvwvK!P94UjK@!|>0|`s<+2&io;V$R?WMu+{?+#b zCLLN0$}^(G^5-FItUm zyBcYK-MsYp(@#ktD-RpI*NEng(LQqm_Z{h-`YZLamS(TcI(25n z$(5#e`W{@%6~FRg`SS&QxvOIzfczFbzxie$s|VvB%UX$N>fLO>Xj}g4%h@$YxfEDG suz!_4r2`c4*G5k-dC-WCU;m$>`%>%yrJ%1dz*3UI)78&qol`;+0CMt}kN^Mx 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..84cb5fd1bb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller-members.html @@ -0,0 +1,124 @@ + + + + + + +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)Tgstation.Server.Host.Controllers.ApiController
ApiHeadersTgstation.Server.Host.Controllers.ApiControllerprotected
applicationTgstation.Server.Host.Controllers.HomeControllerprivate
AuthenticationContextTgstation.Server.Host.Controllers.ApiControllerprotected
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, 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..fb834c74cb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html @@ -0,0 +1,457 @@ + + + + + + +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, ILogger< HomeController > logger)
 Construct a HomeController More...
 
JsonResult Home ()
 Returns the version 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)
 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...
 
+ + + + + + + + + + + + + + + + + +

+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 20 of file HomeController.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.HomeController.HomeController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
ITokenFactory tokenFactory,
ISystemIdentityFactory systemIdentityFactory,
ICryptographySuite cryptographySuite,
IApplication application,
IIdentityCache identityCache,
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
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 54 of file HomeController.cs.

+
54  : base(databaseContext, authenticationContextFactory, logger, false)
55  {
56  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
57  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
58  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
59  this.application = application ?? throw new ArgumentNullException(nameof(application));
60  this.identityCache = identityCache ?? throw new ArgumentNullException(nameof(identityCache));
61  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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 81 of file HomeController.cs.

+ +

References Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Api.ApiHeaders.IsTokenAuthentication, Tgstation.Server.Api.ApiHeaders.Password, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Security.ISystemIdentity.Uid, Tgstation.Server.Host.Security.ISystemIdentity.Username, Tgstation.Server.Api.ApiHeaders.Username, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+
82  {
84  return BadRequest(new Api.Models.ErrorMessage { Message = "Cannot create a token using another token!" });
85 
86  ISystemIdentity identity;
87  try
88  {
89  //trust the system over the database because a user's name can change while still having the same SID
90  identity = await systemIdentityFactory.CreateSystemIdentity(ApiHeaders.Username, ApiHeaders.Password, cancellationToken).ConfigureAwait(false);
91  }
92  catch (NotImplementedException)
93  {
94  identity = null;
95  }
96  using (identity)
97  {
98  IQueryable<User> query;
99  if (identity == null)
100  query = DatabaseContext.Users.Where(x => x.CanonicalName == ApiHeaders.Username.ToUpperInvariant());
101  else
102  query = DatabaseContext.Users.Where(x => x.SystemIdentifier == identity.Uid);
103  var user = await query.Select(x => new User
104  {
105  Id = x.Id,
106  PasswordHash = x.PasswordHash,
107  Enabled = x.Enabled,
108  Name = x.Name
109  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
110 
111  if (user == null)
112  return Unauthorized();
113 
114  if (identity == null)
115  {
116  var originalHash = user.PasswordHash;
118  return Unauthorized();
119  if (user.PasswordHash != originalHash)
120  {
121  var updatedUser = new User
122  {
123  Id = user.Id
124  };
125  DatabaseContext.Users.Attach(updatedUser);
126  updatedUser.PasswordHash = user.PasswordHash;
127  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
128  }
129  }
130  //check if the name changed and updoot accordingly
131  else if (identity.Username != user.Name)
132  {
133  DatabaseContext.Users.Attach(user);
134  user.Name = identity.Username;
135  user.CanonicalName = user.Name.ToUpperInvariant();
136  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
137  }
138 
139  if (!user.Enabled.Value)
140  return Forbid();
141 
142  var token = await tokenFactory.CreateToken(user, cancellationToken).ConfigureAwait(false);
143  if (identity != null)
144  {
145  //expire the identity slightly after the auth token in case of lag
146  var identExpiry = token.ExpiresAt.Value;
147  identExpiry += tokenFactory.ValidationParameters.ClockSkew;
148  identExpiry += TimeSpan.FromSeconds(15);
149  identityCache.CacheSystemIdentity(user, identity, identExpiry);
150  }
151 
152  Logger.LogDebug("Successfully logged in user {0}!", user.Id);
153 
154  return Json(token);
155  }
156  }
bool CheckUserPassword(User user, string password)
Checks a given password matches a given user &#39;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&#39;s username
Definition: ApiHeaders.cs:81
+
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&#39;s password
Definition: ApiHeaders.cs:86
+ +
readonly IIdentityCache identityCache
The IIdentityCache for the HomeController
+
bool IsTokenAuthentication
If the header uses password or JWT authentication
Definition: ApiHeaders.cs:91
+ + +
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 &#39;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
+
+
+
+ +
+
+ + + + + + + +
JsonResult Tgstation.Server.Host.Controllers.HomeController.Home ()
+
+ +

Returns the version of the Application

+
Returns
Application.Version
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Controllers.HomeController.application
+
+private
+
+ +

The IApplication for the HomeController

+ +

Definition at line 37 of file HomeController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Controllers.HomeController.cryptographySuite
+
+private
+
+ +

The ICryptographySuite for the HomeController

+ +

Definition at line 33 of file HomeController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIdentityCache Tgstation.Server.Host.Controllers.HomeController.identityCache
+
+private
+
+ +

The IIdentityCache for the HomeController

+ +

Definition at line 41 of file HomeController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISystemIdentityFactory Tgstation.Server.Host.Controllers.HomeController.systemIdentityFactory
+
+private
+
+ +

The ISystemIdentityFactory for the HomeController

+ +

Definition at line 29 of file HomeController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ITokenFactory Tgstation.Server.Host.Controllers.HomeController.tokenFactory
+
+private
+
+ +

The ITokenFactory for the HomeController

+ +

Definition at line 25 of file HomeController.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_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..fe9d435959 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller-members.html @@ -0,0 +1,128 @@ + + + + + + +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..0f9ce44a9f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html @@ -0,0 +1,771 @@ + + + + + + +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 29 of file InstanceController.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 74 of file InstanceController.cs.

+
74  : base(databaseContext, authenticationContextFactory, logger, false)
75  {
76  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
77  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
78  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
79  this.application = application ?? throw new ArgumentNullException(nameof(application));
80  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
81  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceController.Create ([FromBody] Api.Models.Instance model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 111 of file InstanceController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, Tgstation.Server.Api.Rights.List, Tgstation.Server.Api.Models.ErrorMessage.Message, Tgstation.Server.Api.Models.Internal.User.Name, Tgstation.Server.Api.Models.Online, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Api.Rights.SoftRestart, Tgstation.Server.Api.Rights.SoftShutdown, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
112  {
113  if (model == null)
114  throw new ArgumentNullException(nameof(model));
115 
116  if (String.IsNullOrWhiteSpace(model.Name))
117  return BadRequest(new ErrorMessage { Message = "name must not be empty!" });
118 
119  if (model.Path == null)
120  return BadRequest(new ErrorMessage { Message = "path must not be empty!" });
121 
122  NormalizeModelPath(model, out var rawPath);
123 
124  var localPath = ioManager.ResolvePath(".");
125  NormalizeModelPath(new Api.Models.Instance
126  {
127  Path = localPath
128  }, out var normalizedLocalPath);
129 
130  if (rawPath.StartsWith(normalizedLocalPath, StringComparison.Ordinal))
131  return Conflict("Instances cannot be created in the installation directory!");
132 
133 
134  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
135  bool attached = false;
136  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
137  if (!await ioManager.FileExists(ioManager.ConcatPath(model.Path, InstanceAttachFileName), cancellationToken).ConfigureAwait(false))
138  return Conflict(new ErrorMessage { Message = "Path not empty!" });
139  else
140  attached = true;
141 
142  var newInstance = new Models.Instance
143  {
144  ConfigurationType = model.ConfigurationType ?? ConfigurationType.Disallowed,
146  {
147  AllowWebClient = false,
148  AutoStart = false,
149  PrimaryPort = 1337,
150  SecondaryPort = 1338,
151  SecurityLevel = DreamDaemonSecurity.Safe,
152  SoftRestart = false,
153  SoftShutdown = false,
154  StartupTimeout = 20
155  },
157  {
158  ApiValidationPort = 1339,
159  ApiValidationSecurityLevel = DreamDaemonSecurity.Safe
160  },
161  Name = model.Name,
162  Online = false,
163  Path = model.Path,
164  AutoUpdateInterval = model.AutoUpdateInterval ?? 0,
166  {
167  CommitterEmail = "tgstation-server@users.noreply.github.com",
168  CommitterName = application.VersionPrefix,
169  PushTestMergeCommits = false,
170  ShowTestMergeCommitters = false,
171  AutoUpdatesKeepTestMerges = false,
172  AutoUpdatesSynchronize = false
173  },
174  //give this user full privileges on the instance
175  InstanceUsers = new List<Models.InstanceUser>
176  {
178  }
179  };
180 
181  DatabaseContext.Instances.Add(newInstance);
182  try
183  {
184  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
185 
186  try
187  {
188  //actually reserve it now
189  await ioManager.CreateDirectory(rawPath, cancellationToken).ConfigureAwait(false);
190  await ioManager.DeleteFile(ioManager.ConcatPath(rawPath, InstanceAttachFileName), cancellationToken).ConfigureAwait(false);
191  }
192  catch
193  {
194  //oh shit delete the model
195  DatabaseContext.Instances.Remove(newInstance);
196 
197  await DatabaseContext.Save(default).ConfigureAwait(false);
198  throw;
199  }
200  }
201  catch (IOException e)
202  {
203  return Conflict(new ErrorMessage { Message = e.Message });
204  }
205  catch (DbUpdateException e)
206  {
207  return Conflict(new ErrorMessage { Message = e.Message });
208  }
209 
210  Logger.LogInformation("{0} {1} instance {2}: {3} ({4})", AuthenticationContext.User.Name, attached ? "attached" : "created", newInstance.Name, newInstance.Id, newInstance.Path);
211 
212  var api = newInstance.ToApi();
213  return attached ? (IActionResult)Json(api) : StatusCode((int)HttpStatusCode.Created, api);
214  }
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&#39;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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 218 of file InstanceController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ReattachInformations, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.WatchdogReattachInformations.

+
219  {
220  var originalModel = await DatabaseContext.Instances.Where(x => x.Id == id)
221  .Include(x => x.WatchdogReattachInformation)
222  .Include(x => x.WatchdogReattachInformation.Alpha)
223  .Include(x => x.WatchdogReattachInformation.Bravo)
224  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
225  if (originalModel == default)
226  return StatusCode((int)HttpStatusCode.Gone);
227  if (originalModel.Online.Value)
228  return Conflict(new ErrorMessage
229  {
230  Message = "Cannot detach an online instance!"
231  });
232 
233  if (originalModel.WatchdogReattachInformation != null)
234  {
235  DatabaseContext.WatchdogReattachInformations.Remove(originalModel.WatchdogReattachInformation);
236  if (originalModel.WatchdogReattachInformation.Alpha != null)
237  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Alpha);
238  if (originalModel.WatchdogReattachInformation.Bravo != null)
239  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Bravo);
240  }
241 
242  DatabaseContext.Instances.Remove(originalModel);
243 
244  var attachFileName = ioManager.ConcatPath(originalModel.Path, InstanceAttachFileName);
245  await ioManager.WriteAllBytes(attachFileName, Array.Empty<byte>(), default).ConfigureAwait(false);
246  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); //cascades everything
247  return Ok();
248  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 421 of file InstanceController.cs.

+ +

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.

+
422  {
423  var query = DatabaseContext.Instances.Where(x => x.Id == id);
424  var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
425 
426  if (cantList)
427  query = query.Include(x => x.InstanceUsers);
428 
429  var moveJobTask = query
430  .SelectMany(x => x.Jobs)
431 #pragma warning disable CA1307 // Specify StringComparison
432  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
433 #pragma warning restore CA1307 // Specify StringComparison
434  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
435  .FirstOrDefaultAsync(cancellationToken);
436  var instance = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
437 
438  if (instance == null)
439  return StatusCode((int)HttpStatusCode.Gone);
440 
441  if (cantList && !instance.InstanceUsers.Any(x => x.UserId == AuthenticationContext.User.Id && x.AnyRights))
442  return Forbid();
443 
444  var api = instance.ToApi();
445  api.MoveJob = (await moveJobTask.ConfigureAwait(false))?.ToApi();
446  return Json(api);
447  }
+
InstanceManagerRights InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+ +
InstanceManagerRights
Rights for managing Models.Instances
+ +
long Id
The ID of the User
Definition: User.cs:15
+ + +
+
+
+ +
+
+ + + + + +
+ + + + + + + +
Models.InstanceUser Tgstation.Server.Host.Controllers.InstanceController.InstanceAdminUser ()
+
+private
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 397 of file InstanceController.cs.

+ +

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.

+
398  {
399  IQueryable<Models.Instance> query = DatabaseContext.Instances;
401  query = query.Where(x => x.InstanceUsers.Any(y => y.UserId == AuthenticationContext.User.Id)).Where(x => x.InstanceUsers.Any(y => y.AnyRights));
402 
403  var moveJobTasks = query
404  .SelectMany(x => x.Jobs)
405 #pragma warning disable CA1307 // Specify StringComparison
406  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
407 #pragma warning restore CA1307 // Specify StringComparison
408  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
409  .Include(x => x.Instance)
410  .ToListAsync(cancellationToken);
411  var instances = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
412  var apis = instances.Select(x => x.ToApi());
413  var moveJobs = await moveJobTasks.ConfigureAwait(false);
414  foreach(var I in moveJobs)
415  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
416  return Json(apis);
417  }
+
InstanceManagerRights InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+ +
InstanceManagerRights
Rights for managing Models.Instances
+ +
long Id
The ID of the User
Definition: User.cs:15
+ + +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Controllers.InstanceController.NormalizeModelPath (Api.Models.Instance model,
out string absolutePath 
)
+
+private
+
+ +

Definition at line 83 of file InstanceController.cs.

+ +

References Tgstation.Server.Api.Models.Internal.User.Id, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
84  {
85  if (model.Path == null)
86  {
87  absolutePath = null;
88  return;
89  }
90  absolutePath = ioManager.ResolvePath(model.Path);
92  model.Path = absolutePath.ToUpperInvariant();
93  else
94  model.Path = absolutePath;
95  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceController.Update ([FromBody] Api.Models.Instance model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 252 of file InstanceController.cs.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances.

+
253  {
254  var instanceQuery = DatabaseContext.Instances.Where(x => x.Id == model.Id);
255 
256  var moveJob = await instanceQuery
257  .SelectMany(x => x.Jobs).
258 #pragma warning disable CA1307 // Specify StringComparison
259  Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
260 #pragma warning restore CA1307 // Specify StringComparison
261  .Select(x => new Models.Job
262  {
263  Id = x.Id
264  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
265 
266  if (moveJob != default)
267  //cancel it now
268  await jobManager.CancelJob(moveJob, AuthenticationContext.User, true, cancellationToken).ConfigureAwait(false);
269 
270  var usersInstanceUserTask = instanceQuery.SelectMany(x => x.InstanceUsers).Where(x => x.UserId == AuthenticationContext.User.Id).FirstOrDefaultAsync(cancellationToken);
271 
272  var originalModel = await instanceQuery
273  .Include(x => x.RepositorySettings)
274  .Include(x => x.ChatSettings)
275  .ThenInclude(x => x.Channels)
276  .Include(x => x.DreamDaemonSettings) //need these for onlining
277  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
278  if (originalModel == default(Models.Instance))
279  return StatusCode((int)HttpStatusCode.Gone);
280 
281  var userRights = (InstanceManagerRights)AuthenticationContext.GetRight(RightsType.InstanceManager);
282  bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression, InstanceManagerRights requiredRight)
283  {
284  var memberSelectorExpression = (MemberExpression)expression.Body;
285  var property = (PropertyInfo)memberSelectorExpression.Member;
286 
287  var newVal = property.GetValue(model);
288  if (newVal == null)
289  return false;
290  if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
291  return true;
292 
293  property.SetValue(originalModel, newVal);
294  return false;
295  };
296 
297  string originalModelPath = null;
298  string rawPath = null;
299  if (model.Path != null)
300  {
301  NormalizeModelPath(model, out rawPath);
302 
303  if (model.Path != originalModel.Path)
304  {
305  if (!userRights.HasFlag(InstanceManagerRights.Relocate))
306  return Forbid();
307  if (originalModel.Online.Value && model.Online != true)
308  return Conflict(new ErrorMessage { Message = "Cannot relocate an online instance!" });
309 
310  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
311  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
312  return Conflict(new ErrorMessage { Message = "Path not empty!" });
313 
314  originalModelPath = originalModel.Path;
315  originalModel.Path = model.Path;
316  }
317  }
318 
319  var oldAutoUpdateInterval = originalModel.AutoUpdateInterval.Value;
320  var originalOnline = originalModel.Online.Value;
321  var renamed = model.Name != null && originalModel.Name != model.Name;
322 
323  if (CheckModified(x => x.AutoUpdateInterval, InstanceManagerRights.SetAutoUpdate)
324  || CheckModified(x => x.ConfigurationType, InstanceManagerRights.SetConfiguration)
325  || CheckModified(x => x.Name, InstanceManagerRights.Rename)
326  || CheckModified(x => x.Online, InstanceManagerRights.SetOnline))
327  return Forbid();
328 
329  //ensure the current user has write privilege on the instance
330  var usersInstanceUser = await usersInstanceUserTask.ConfigureAwait(false);
331  if (usersInstanceUser == default)
332  {
333  var instanceAdminUser = InstanceAdminUser();
334  instanceAdminUser.InstanceId = originalModel.Id;
335  DatabaseContext.InstanceUsers.Add(instanceAdminUser);
336  }
337  else
338  usersInstanceUser.InstanceUserRights |= InstanceUserRights.WriteUsers;
339 
340  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
341 
342  if (renamed)
343  instanceManager.GetInstance(originalModel).Rename(originalModel.Name);
344 
345  var oldAutoStart = originalModel.DreamDaemonSettings.AutoStart;
346  try
347  {
348  if (originalOnline && model.Online == false)
349  await instanceManager.OfflineInstance(originalModel, AuthenticationContext.User, cancellationToken).ConfigureAwait(false);
350  else if (!originalOnline && model.Online == true)
351  {
352  //force autostart false here because we don't want any long running jobs right now
353  //remember to document this
354  originalModel.DreamDaemonSettings.AutoStart = false;
355  await instanceManager.OnlineInstance(originalModel, cancellationToken).ConfigureAwait(false);
356  }
357  }
358  catch (Exception e)
359  {
360  if(!(e is OperationCanceledException))
361  Logger.LogError("Error changing instance online state! Exception: {0}", e);
362  originalModel.Online = originalOnline;
363  originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
364  if (originalModelPath != null)
365  originalModel.Path = originalModelPath;
366  await DatabaseContext.Save(default).ConfigureAwait(false);
367  throw;
368  }
369 
370  var api = (AuthenticationContext.GetRight(RightsType.InstanceManager) & (ulong)InstanceManagerRights.Read) != 0 ? originalModel.ToApi() : new Api.Models.Instance
371  {
372  Id = originalModel.Id
373  };
374  if (originalModelPath != null)
375  {
376  var job = new Models.Job
377  {
378  Description = String.Format(CultureInfo.InvariantCulture, MoveInstanceJobPrefix + "{0} from {1} to {2}", originalModel.Id, originalModel.Path, rawPath),
379  Instance = originalModel,
380  CancelRightsType = RightsType.InstanceManager,
381  CancelRight = (ulong)InstanceManagerRights.Relocate,
382  StartedBy = AuthenticationContext.User
383  };
384 
385  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => instanceManager.MoveInstance(originalModel, rawPath, ct), cancellationToken).ConfigureAwait(false);
386  api.MoveJob = job.ToApi();
387  }
388 
389  if (originalModel.Online.Value && model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval)
390  await instanceManager.GetInstance(originalModel).SetAutoUpdateInterval(model.AutoUpdateInterval.Value).ConfigureAwait(false);
391 
392  return Json(api);
393  }
+ + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Controllers.InstanceController.application
+
+private
+
+ +

The IApplication for the InstanceController

+ +

Definition at line 56 of file InstanceController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName = "TGS4_ALLOW_INSTANCE_ATTACH"
+
+private
+
+ +

File name to allow attaching instances

+ +

Definition at line 34 of file InstanceController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.InstanceController.instanceManager
+
+private
+
+ +

The IInstanceManager for the InstanceController

+ +

Definition at line 46 of file InstanceController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Controllers.InstanceController.ioManager
+
+private
+
+ +

The IIOManager for the InstanceController

+ +

Definition at line 51 of file InstanceController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.InstanceController.jobManager
+
+private
+
+ +

The IJobManager for the InstanceController

+ +

Definition at line 41 of file InstanceController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Controllers.InstanceController.MoveInstanceJobPrefix = "Move instance ID "
+
+private
+
+ +

Definition at line 36 of file InstanceController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier
+
+private
+
+ +

The IPlatformIdentifier for the InstanceController

+ +

Definition at line 61 of file InstanceController.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_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..756e673da1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller-members.html @@ -0,0 +1,120 @@ + + + + + + +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..e705285690 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html @@ -0,0 +1,495 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.InstanceUsers, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 128 of file InstanceUserController.cs.

+ +

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances.

+
129  {
130  await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).DeleteAsync(cancellationToken).ConfigureAwait(false);
131  return Ok();
132  }
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 117 of file InstanceUserController.cs.

+ +

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances.

+
118  {
119  //this functions as userId
120  var user = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
121  if (user == default)
122  return StatusCode((int)HttpStatusCode.Gone);
123  return Json(user.ToApi());
124  }
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 109 of file InstanceUserController.cs.

+ +

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances.

+
110  {
111  var users = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).ToListAsync(cancellationToken).ConfigureAwait(false);
112  return Json(users.Select(x => x.ToApi()));
113  }
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 >.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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, 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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceUserController.Update ([FromBody] Api.Models.InstanceUser model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 78 of file InstanceUserController.cs.

+ +

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.Security.AuthenticationContext.InstanceUser, Tgstation.Server.Api.Rights.Read, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
79  {
80  var test = StandardModelChecks(model);
81  if (test != null)
82  return test;
83 
84  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);
85  if (originalUser == null)
86  return StatusCode((int)HttpStatusCode.Gone);
87 
88  originalUser.ByondRights = model.ByondRights ?? originalUser.ByondRights;
89  originalUser.RepositoryRights = model.RepositoryRights ?? originalUser.RepositoryRights;
90  originalUser.InstanceUserRights = model.InstanceUserRights ?? originalUser.InstanceUserRights;
91  originalUser.ChatBotRights = model.ChatBotRights ?? originalUser.ChatBotRights;
92  originalUser.ConfigurationRights = model.ConfigurationRights ?? originalUser.ConfigurationRights;
93  originalUser.DreamDaemonRights = model.DreamDaemonRights ?? originalUser.DreamDaemonRights;
94  originalUser.DreamMakerRights = model.DreamMakerRights ?? originalUser.DreamMakerRights;
95 
96  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
97  return Json(originalUser.UserId == AuthenticationContext.User.Id || (AuthenticationContext.GetRight(RightsType.InstanceUser) & (ulong)InstanceUserRights.ReadUsers) != 0 ? originalUser.ToApi() : new Api.Models.InstanceUser
98  {
99  UserId = originalUser.UserId
100  });
101  }
+
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
+ +
+
+
+
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..d6e51a6a65 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html @@ -0,0 +1,411 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs.

+
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  }
int JobProgress(Job job)
Get the Api.Models.Job.Progress for a job
+ + + +
readonly IJobManager jobManager
The IJobManager for the JobController
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs.

+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs.

+
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.JobController.jobManager
+
+private
+
+ +

The IJobManager for the JobController

+ +

Definition at line 25 of file JobController.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_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..a4a090e581 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller-members.html @@ -0,0 +1,123 @@ + + + + + + +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)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..ed4dd99b77 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html @@ -0,0 +1,497 @@ + + + + + + +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)
 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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) { }
readonly bool requireInstance
If IAuthenticationContext.InstanceUser permissions are required to access the ApiController ...
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.List (CancellationToken cancellationToken)
+
+virtual
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.Read (CancellationToken cancellationToken)
+
+virtual
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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..7d79624ce1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller-members.html @@ -0,0 +1,126 @@ + + + + + + +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..e2934ecab4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html @@ -0,0 +1,694 @@ + + + + + + +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 29 of file RepositoryController.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 61 of file RepositoryController.cs.

+
61  : base(databaseContext, authenticationContextFactory, logger, true)
62  {
63  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
64  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
65  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
66  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
67  }
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the RepositoryController
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.RepositoryController.Create ([FromBody] Repository model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 127 of file RepositoryController.cs.

+ +

References Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
128  {
129  if (model == null)
130  throw new ArgumentNullException(nameof(model));
131 
132  if (model.Origin == null)
133  return BadRequest(new ErrorMessage { Message = "Missing repo origin!" });
134 
135  if (model.AccessUser == null ^ model.AccessToken == null)
136  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
137 
138  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
139 
140  if (currentModel == default)
141  return StatusCode((int)HttpStatusCode.Gone);
142 
143  //normalize github urls
144  const string BadGitHubUrl = "://www.github.com/";
145  var uiOrigin = model.Origin.ToUpperInvariant();
146  var uiBad = BadGitHubUrl.ToUpperInvariant();
147  var uiGitHub = Components.Repository.Repository.GitHubUrl.ToUpperInvariant();
148  if (uiOrigin.Contains(uiBad, StringComparison.Ordinal))
149  model.Origin = uiOrigin.Replace(uiBad, uiGitHub, StringComparison.Ordinal);
150 
151  currentModel.AccessToken = model.AccessToken;
152  currentModel.AccessUser = model.AccessUser; //intentionally only these fields, user not allowed to change anything else atm
153  var cloneBranch = model.Reference;
154  var origin = model.Origin;
155 
157 
158  if (repoManager.CloneInProgress)
159  return Conflict(new ErrorMessage
160  {
161  Message = "A clone operation is in progress!"
162  });
163 
164  if(repoManager.InUse)
165  return Conflict(new ErrorMessage
166  {
167  Message = "The repo is busy!"
168  });
169 
170  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
171  {
172  if (repo != null)
173  //clone conflict
174  return Conflict(new ErrorMessage
175  {
176  Message = "The repository already exists!"
177  });
178 
179  var job = new Models.Job
180  {
181  Description = String.Format(CultureInfo.InvariantCulture, "Clone branch {1} of repository {0}", origin, cloneBranch ?? "master"),
182  StartedBy = AuthenticationContext.User,
183  CancelRightsType = RightsType.Repository,
184  CancelRight = (ulong)RepositoryRights.CancelClone,
186  };
187  var api = currentModel.ToApi();
188  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
189  {
190  using (var repos = await repoManager.CloneRepository(new Uri(origin), cloneBranch, currentModel.AccessUser, currentModel.AccessToken, progressReporter, ct).ConfigureAwait(false))
191  {
192  if (repos == null)
193  throw new JobException("Filesystem conflict while cloning repository!");
194  var instance = new Models.Instance
195  {
196  Id = Instance.Id
197  };
198  databaseContext.Instances.Attach(instance);
199  if (await PopulateApi(api, repos, databaseContext, instance, ct).ConfigureAwait(false))
200  await databaseContext.Save(ct).ConfigureAwait(false);
201  }
202  }, cancellationToken).ConfigureAwait(false);
203 
204  api.Origin = model.Origin;
205  api.Reference = model.Reference;
206  api.ActiveJob = job.ToApi();
207 
208  return StatusCode((int)HttpStatusCode.Created, api);
209  }
210  }
+
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 , 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
+
+
+
+ +
+
+ + + + + + + + +
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 218 of file RepositoryController.cs.

+ +

References Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
219  {
220  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
221 
222  if (currentModel == default)
223  return StatusCode((int)HttpStatusCode.Gone);
224 
225  currentModel.AccessToken = null;
226  currentModel.AccessUser = null;
227 
228  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
229 
230  Logger.LogInformation("Instance {0} repository delete initiated by user {1}", Instance.Id, AuthenticationContext.User.Id);
231 
232  var job = new Models.Job
233  {
234  Description = "Delete repository",
235  StartedBy = AuthenticationContext.User,
237  };
238  var api = currentModel.ToApi();
239  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => instanceManager.GetInstance(Instance).RepositoryManager.DeleteRepository(cancellationToken), cancellationToken).ConfigureAwait(false);
240  api.ActiveJob = job.ToApi();
241  return Accepted(api);
242  }
+
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 69 of file RepositoryController.cs.

+ +

References Tgstation.Server.Api.Rights.CompileJobs, Tgstation.Server.Api.Rights.List, and Tgstation.Server.Host.Models.IDatabaseContext.RevisionInformations.

+
70  {
71  var repoSha = repository.Head;
72 
73  IQueryable<Models.RevisionInformation> ApplyQuery(IQueryable<Models.RevisionInformation> query) => query
74  .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id)
75  .Include(x => x.CompileJobs)
76  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy);
77 
78  var revisionInfo = await ApplyQuery(databaseContext.RevisionInformations).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
79 
80  if (revisionInfo == default)
81  revisionInfo = databaseContext.RevisionInformations.Local.Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id).FirstOrDefault();
82 
83  var needsDbUpdate = revisionInfo == default;
84  if (needsDbUpdate)
85  {
86  //needs insertion
87  revisionInfo = new Models.RevisionInformation
88  {
89  Instance = instance,
90  CommitSha = repoSha,
91  CompileJobs = new List<Models.CompileJob>(),
92  ActiveTestMerges = new List<RevInfoTestMerge>() //non null vals for api returns
93  };
94 
95  lock (databaseContext) //cleaner this way
96  databaseContext.RevisionInformations.Add(revisionInfo);
97  }
98  revisionInfo.OriginCommitSha = revisionInfo.OriginCommitSha ?? lastOriginCommitSha;
99  if (revisionInfo.OriginCommitSha == null)
100  {
101  revisionInfo.OriginCommitSha = repoSha;
102  Logger.LogWarning(Components.Repository.Repository.OriginTrackingErrorTemplate, repoSha);
103  }
104  revInfoSink?.Invoke(revisionInfo);
105  return needsDbUpdate;
106  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 108 of file RepositoryController.cs.

+ +

References Tgstation.Server.Api.Models.Repository.GitHubName, Tgstation.Server.Api.Models.Repository.GitHubOwner, Tgstation.Server.Api.Models.Repository.Origin, Tgstation.Server.Api.Models.Repository.Reference, and Tgstation.Server.Api.Models.Repository.RevisionInformation.

+
109  {
110  if (repository.IsGitHubRepository)
111  {
112  model.GitHubOwner = repository.GitHubOwner;
113  model.GitHubName = repository.GitHubRepoName;
114  }
115  model.Origin = repository.Origin;
116  model.Reference = repository.Reference;
117 
118  //rev info stuff
119  Models.RevisionInformation revisionInfo = null;
120  var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, null, x => revisionInfo = x, cancellationToken).ConfigureAwait(false);
121  model.RevisionInformation = revisionInfo.ToApi();
122  return needsDbUpdate;
123  }
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 , 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> 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 246 of file RepositoryController.cs.

+ +

References Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+
247  {
248  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
249 
250  if (currentModel == default)
251  return StatusCode((int)HttpStatusCode.Gone);
252 
253  var api = currentModel.ToApi();
255 
256  if (repoManager.CloneInProgress)
257  return Conflict(new ErrorMessage
258  {
259  Message = "A clone operation is in progress!"
260  });
261 
262  if (repoManager.InUse)
263  return Conflict(new ErrorMessage
264  {
265  Message = "The repo is busy!"
266  });
267 
268  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
269  {
270  if (repo != null && await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false))
271  {
272  //user may have fucked with the repo without telling us, do what we can
273  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
274  return StatusCode((int)HttpStatusCode.Created, api);
275  }
276  return Json(api);
277  }
278  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.RepositoryController.Update ([FromBody] Repository model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 282 of file RepositoryController.cs.

+ +

References Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Api.Models.Internal.User.Name, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+
283  {
284  if (model == null)
285  throw new ArgumentNullException(nameof(model));
286 
287  if (model.AccessUser == null ^ model.AccessToken == null)
288  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
289 
290  if (model.CheckoutSha != null && model.Reference != null)
291  return BadRequest(new ErrorMessage { Message = "Only one of sha or reference may be specified!" });
292 
293  if (model.CheckoutSha != null && model.UpdateFromOrigin == true)
294  return BadRequest(new ErrorMessage { Message = "Cannot update a reference when checking out a sha!" });
295 
296  if (model.Origin != null)
297  return BadRequest(new ErrorMessage { Message = "origin cannot be modified without deleting the repository!" });
298 
299  if (model.NewTestMerges?.Any(x => !x.Number.HasValue) == true)
300  return BadRequest(new ErrorMessage { Message = "All new test merges must provide a number!" });
301 
302  if (model.NewTestMerges?.Any(x => model.NewTestMerges.Any(y => x != y && x.Number == y.Number)) == true)
303  return BadRequest(new ErrorMessage { Message = "Cannot test merge the same PR twice in one job!" });
304 
305  if (model.CommitterName?.Length == 0)
306  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer name!" });
307 
308  if (model.CommitterEmail?.Length == 0)
309  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer e=mail!" });
310 
311  var newTestMerges = model.NewTestMerges != null && model.NewTestMerges.Count > 0;
312  var userRights = (RepositoryRights)AuthenticationContext.GetRight(RightsType.Repository);
313  if (newTestMerges && !userRights.HasFlag(RepositoryRights.MergePullRequest))
314  return Forbid();
315 
316  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
317 
318  if (currentModel == default)
319  return StatusCode((int)HttpStatusCode.Gone);
320 
321  bool CheckModified<T>(Expression<Func<Api.Models.Internal.RepositorySettings, T>> expression, RepositoryRights requiredRight)
322  {
323  var memberSelectorExpression = (MemberExpression)expression.Body;
324  var property = (PropertyInfo)memberSelectorExpression.Member;
325 
326  var newVal = property.GetValue(model);
327  if (newVal == null)
328  return false;
329  if (!userRights.HasFlag(requiredRight) && property.GetValue(currentModel) != newVal)
330  return true;
331 
332  property.SetValue(currentModel, newVal);
333  return false;
334  };
335 
336  if (CheckModified(x => x.AccessToken, RepositoryRights.ChangeCredentials)
337  || CheckModified(x => x.AccessUser, RepositoryRights.ChangeCredentials)
338  || CheckModified(x => x.AutoUpdatesKeepTestMerges, RepositoryRights.ChangeAutoUpdateSettings)
339  || CheckModified(x => x.AutoUpdatesSynchronize, RepositoryRights.ChangeAutoUpdateSettings)
340  || CheckModified(x => x.CommitterEmail, RepositoryRights.ChangeCommitter)
341  || CheckModified(x => x.CommitterName, RepositoryRights.ChangeCommitter)
342  || CheckModified(x => x.PushTestMergeCommits, RepositoryRights.ChangeTestMergeCommits)
343  || CheckModified(x => x.ShowTestMergeCommitters, RepositoryRights.ChangeTestMergeCommits)
344  || (model.UpdateFromOrigin == true && !userRights.HasFlag(RepositoryRights.UpdateBranch)))
345  return Forbid();
346 
347  if (currentModel.AccessToken?.Length == 0 && currentModel.AccessUser?.Length == 0)
348  {
349  //setting an empty string clears everything
350  currentModel.AccessUser = null;
351  currentModel.AccessToken = null;
352  }
353 
354  var canRead = userRights.HasFlag(RepositoryRights.Read);
355 
356  var api = canRead ? currentModel.ToApi() : new Repository();
358 
359  if (canRead)
360  {
361  if (repoManager.CloneInProgress)
362  return Conflict(new ErrorMessage
363  {
364  Message = "A clone operation is in progress!"
365  });
366 
367  if (repoManager.InUse)
368  return Conflict(new ErrorMessage
369  {
370  Message = "The repo is busy!"
371  });
372 
373  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
374  {
375  if (repo == null)
376  return Conflict(new ErrorMessage
377  {
378  Message = "Repository could not be loaded!"
379  });
380  await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false);
381  }
382  }
383 
384  //this is just db stuf so stow it away
385  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
386 
387  //format the job description
388  string description = null;
389  if (model.UpdateFromOrigin == true)
390  if (model.Reference != null)
391  description = String.Format(CultureInfo.InvariantCulture, "Fetch and hard reset repository to origin/{0}", model.Reference);
392  else if (model.CheckoutSha != null)
393  description = String.Format(CultureInfo.InvariantCulture, "Fetch and checkout {0} in repository", model.CheckoutSha);
394  else
395  description = "Pull current repository reference";
396  else if (model.Reference != null || model.CheckoutSha != null)
397  description = String.Format(CultureInfo.InvariantCulture, "Checkout repository {0} {1}", model.Reference != null ? "reference" : "SHA", model.Reference ?? model.CheckoutSha);
398 
399  if (newTestMerges)
400  description = String.Format(CultureInfo.InvariantCulture, "{0}est merge pull request(s) {1}{2}",
401  description != null ? String.Format(CultureInfo.InvariantCulture, "{0} and t", description) : "T",
402  String.Join(", ", model.NewTestMerges.Select(x =>
403  String.Format(CultureInfo.InvariantCulture, "#{0}{1}", x.Number,
404  x.PullRequestRevision != null ? String.Format(CultureInfo.InvariantCulture, " at {0}", x.PullRequestRevision.Substring(0, 7)) : String.Empty))),
405  description != null ? String.Empty : " in repository");
406 
407  if (description == null)
408  //no git changes
409  return Json(api);
410 
411  var job = new Models.Job
412  {
413  Description = description,
414  StartedBy = AuthenticationContext.User,
415  Instance = Instance,
416  CancelRightsType = RightsType.Repository,
417  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
418  };
419 
420  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
421  {
422  using (var repo = await repoManager.LoadRepository(ct).ConfigureAwait(false))
423  {
424  if (repo == null)
425  throw new JobException("Repository could not be loaded!");
426 
427  var modelHasShaOrReference = model.CheckoutSha != null || model.Reference != null;
428 
429  var startReference = repo.Reference;
430  var startSha = repo.Head;
431  string postUpdateSha = null;
432 
433  if (newTestMerges && !repo.IsGitHubRepository)
434  throw new JobException("Cannot test merge on a non GitHub based repository!");
435 
436  var committerName = currentModel.ShowTestMergeCommitters.Value ? AuthenticationContext.User.Name : currentModel.CommitterName;
437 
438  var hardResettingToOriginReference = model.UpdateFromOrigin == true && model.Reference != null;
439 
440  var numSteps = (model.NewTestMerges?.Count ?? 0) + (model.UpdateFromOrigin == true ? 1 : 0) + (!modelHasShaOrReference ? 2 : (hardResettingToOriginReference ? 3 : 1));
441  var doneSteps = 0;
442 
443  Action<int> NextProgressReporter()
444  {
445  var tmpDoneSteps = doneSteps;
446  ++doneSteps;
447  return progress => progressReporter((progress + 100 * tmpDoneSteps) / numSteps);
448  };
449 
450  progressReporter(0);
451 
452  //get a base line for where we are
453  Models.RevisionInformation lastRevisionInfo = null;
454 
455  var attachedInstance = new Models.Instance
456  {
457  Id = Instance.Id
458  };
459  databaseContext.Instances.Attach(attachedInstance);
460 
461  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
462 
463  //apply new rev info, tracking applied test merges
464  async Task UpdateRevInfo()
465  {
466  var last = lastRevisionInfo;
467  await LoadRevisionInformation(repo, databaseContext, attachedInstance, last.OriginCommitSha, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
468  lastRevisionInfo.ActiveTestMerges.AddRange(last.ActiveTestMerges);
469  };
470 
471  try
472  {
473  //fetch/pull
474  if (model.UpdateFromOrigin == true)
475  {
476  if (!repo.Tracking)
477  throw new JobException("Not on an updatable reference!");
478  await repo.FetchOrigin(currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
479  doneSteps = 1;
480  if (!modelHasShaOrReference)
481  {
482  var fastForward = await repo.MergeOrigin(committerName, currentModel.CommitterEmail, NextProgressReporter(), ct).ConfigureAwait(false);
483  if (!fastForward.HasValue)
484  throw new JobException("Merge conflict occurred during origin update!");
485  await UpdateRevInfo().ConfigureAwait(false);
486  if (fastForward.Value)
487  {
488  lastRevisionInfo.OriginCommitSha = repo.Head;
489  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
490  postUpdateSha = repo.Head;
491  }
492  else
493  NextProgressReporter()(100);
494  }
495  }
496 
497  //checkout/hard reset
498  if (modelHasShaOrReference)
499  {
500  if ((model.CheckoutSha != null && repo.Head.ToUpperInvariant().StartsWith(model.CheckoutSha.ToUpperInvariant(), StringComparison.Ordinal))
501  || (model.Reference != null && repo.Reference.ToUpperInvariant() != model.Reference.ToUpperInvariant()))
502  {
503  var committish = model.CheckoutSha ?? model.Reference;
504  var isSha = await repo.IsSha(committish, cancellationToken).ConfigureAwait(false);
505 
506  if ((isSha && model.Reference != null) || (!isSha && model.CheckoutSha != null))
507  throw new JobException("Attempted to checkout a SHA or reference that was actually the opposite!");
508 
509  await repo.CheckoutObject(committish, NextProgressReporter(), ct).ConfigureAwait(false);
510  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
511  }
512  else
513  NextProgressReporter()(100);
514 
515  if (hardResettingToOriginReference)
516  {
517  if (!repo.Tracking)
518  throw new JobException("Checked out reference does not track a remote object!");
519  await repo.ResetToOrigin(NextProgressReporter(), ct).ConfigureAwait(false);
520  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
521  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
522  //repo head is on origin so force this
523  //will update the db if necessary
524  lastRevisionInfo.OriginCommitSha = repo.Head;
525  }
526  }
527 
528  Dictionary<int, Octokit.PullRequest> prMap = null;
529  //test merging
530  if (newTestMerges)
531  {
532  //bit of sanitization
533  foreach (var I in model.NewTestMerges.Where(x => String.IsNullOrWhiteSpace(x.PullRequestRevision)))
534  I.PullRequestRevision = null;
535 
536  var gitHubClient = currentModel.AccessToken != null
537  ? gitHubClientFactory.CreateClient(currentModel.AccessToken)
538  : (String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken)
541 
542  var repoOwner = repo.GitHubOwner;
543  var repoName = repo.GitHubRepoName;
544 
545  Models.RevisionInformation revInfoWereLookingFor = null;
546  bool needToApplyRemainingPrs = true;
547  //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
548  if (lastRevisionInfo.OriginCommitSha == lastRevisionInfo.CommitSha)
549  {
550  //In order for this to work though we need the shas of all the commits
551  if (model.NewTestMerges.Any(x => x.PullRequestRevision == null))
552  prMap = new Dictionary<int, Octokit.PullRequest>();
553 
554  bool cantSearch = false;
555  foreach (var I in model.NewTestMerges)
556  {
557  if (I.PullRequestRevision != null)
558  //normalize the shas to lowercase ala libgit2
559 #pragma warning disable CA1308 // Normalize strings to uppercase
560  I.PullRequestRevision = I.PullRequestRevision?.ToLowerInvariant();
561 #pragma warning restore CA1308 // Normalize strings to uppercase
562  else
563  //retrieve the latest sha
564  try
565  {
566  var pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
567  prMap.Add(I.Number.Value, pr);
568  I.PullRequestRevision = pr.Head.Sha;
569  }
570  catch
571  {
572  cantSearch = true;
573  break;
574  }
575  }
576 
577  if (!cantSearch)
578  {
579  var dbPull = await databaseContext.RevisionInformations
580  .Where(x => x.Instance.Id == Instance.Id
581  && x.OriginCommitSha == lastRevisionInfo.OriginCommitSha
582  && x.ActiveTestMerges.Count <= model.NewTestMerges.Count
583  && x.ActiveTestMerges.Count > 0)
584  .Include(x => x.ActiveTestMerges)
585  .ThenInclude(x => x.TestMerge)
586  .ToListAsync(cancellationToken).ConfigureAwait(false);
587 
588  //split here cause this bit has to be done locally
589  revInfoWereLookingFor = dbPull
590  .Where(x => x.ActiveTestMerges.Count == model.NewTestMerges.Count
591  && x.ActiveTestMerges.Select(y => y.TestMerge)
592  .All(y => model.NewTestMerges.Any(z =>
593  y.Number == z.Number
594  && y.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
595  && (y.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))))
596  .FirstOrDefault();
597 
598  if (revInfoWereLookingFor == null && model.NewTestMerges.Count > 1)
599  {
600  //okay try to add at least SOME prs we've seen before
601  var search = model.NewTestMerges.ToList();
602 
603  var appliedTestMergeIds = new List<long>();
604 
605  Models.RevisionInformation lastGoodRevInfo = null;
606  do
607  {
608  foreach (var I in search)
609  {
610  revInfoWereLookingFor = dbPull
611  .Where(x => model.NewTestMerges.Any(z =>
612  x.PrimaryTestMerge.Number == z.Number
613  && x.PrimaryTestMerge.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
614  && (x.PrimaryTestMerge.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))
615  && x.ActiveTestMerges.Select(y => y.TestMerge).All(y => appliedTestMergeIds.Contains(y.Id)))
616  .FirstOrDefault();
617 
618  if (revInfoWereLookingFor != null)
619  {
620  lastGoodRevInfo = revInfoWereLookingFor;
621  appliedTestMergeIds.Add(revInfoWereLookingFor.PrimaryTestMerge.Id);
622  search.Remove(I);
623  break;
624  }
625  }
626  } while (revInfoWereLookingFor != null && search.Count > 0);
627 
628  revInfoWereLookingFor = lastGoodRevInfo;
629  needToApplyRemainingPrs = search.Count != 0;
630  if (needToApplyRemainingPrs)
631  model.NewTestMerges = search;
632  }
633  else if (revInfoWereLookingFor != null)
634  needToApplyRemainingPrs = false;
635  }
636  }
637 
638  if (revInfoWereLookingFor != null)
639  {
640  //goteem
641  await repo.ResetToSha(revInfoWereLookingFor.CommitSha, NextProgressReporter(), cancellationToken).ConfigureAwait(false);
642  lastRevisionInfo = revInfoWereLookingFor;
643  }
644 
645  if (needToApplyRemainingPrs)
646  {
647  //an invocation of LoadRevisionInformation could have already loaded this user
648  var contextUser = databaseContext.Users.Local.Where(x => x.Id == AuthenticationContext.User.Id).FirstOrDefault();
649  if (contextUser == default)
650  {
651  contextUser = new Models.User
652  {
654  };
655  databaseContext.Users.Attach(contextUser);
656  }
657  else
658  Logger.LogTrace("Skipping attaching the user to the database context as it is already loaded!");
659 
660  foreach (var I in model.NewTestMerges)
661  {
662  Octokit.PullRequest pr = null;
663  string errorMessage = null;
664 
665  if (lastRevisionInfo.ActiveTestMerges.Any(x => x.TestMerge.Number == I.Number.Value))
666  throw new JobException("Cannot test merge the same PR twice in one HEAD!");
667 
668  try
669  {
670  //load from cache if possible
671  if (prMap == null || !prMap.TryGetValue(I.Number.Value, out pr))
672  pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
673  }
674  catch (Octokit.RateLimitExceededException)
675  {
676  //you look at your anonymous access and sigh
677  errorMessage = "P.R.E. RATE LIMITED";
678  }
679  catch (Octokit.AuthorizationException)
680  {
681  errorMessage = "P.R.E. BAD CREDENTIALS";
682  }
683  catch (Octokit.NotFoundException)
684  {
685  //you look at your shithub and sigh
686  errorMessage = "P.R.E. NOT FOUND";
687  }
688 
689  //we want to take the earliest truth possible to prevent RCEs, if this fails AddTestMerge will set it
690  if (I.PullRequestRevision == null && pr != null)
691  I.PullRequestRevision = pr.Head.Sha;
692 
693  var mergeResult = await repo.AddTestMerge(I, committerName, currentModel.CommitterEmail, currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
694 
695  if (!mergeResult.HasValue)
696  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Merge of PR #{0} at {1} conflicted!", I.Number, I.PullRequestRevision.Substring(0, 7)));
697 
698  ++doneSteps;
699 
700  var revInfoUpdateTask = UpdateRevInfo();
701 
702  var tm = new Models.TestMerge
703  {
704  Author = pr?.User.Login ?? errorMessage,
705  BodyAtMerge = pr?.Body ?? errorMessage ?? String.Empty,
706  MergedAt = DateTimeOffset.Now,
707  TitleAtMerge = pr?.Title ?? errorMessage ?? String.Empty,
708  Comment = I.Comment,
709  Number = I.Number,
710  MergedBy = contextUser,
711  PullRequestRevision = I.PullRequestRevision,
712  Url = pr?.HtmlUrl ?? errorMessage
713  };
714 
715  await revInfoUpdateTask.ConfigureAwait(false);
716 
717  lastRevisionInfo.PrimaryTestMerge = tm;
718  lastRevisionInfo.ActiveTestMerges.Add(new RevInfoTestMerge
719  {
720  TestMerge = tm
721  });
722  }
723  }
724  }
725 
726  var currentHead = repo.Head;
727  if (startSha != currentHead || (postUpdateSha != null && postUpdateSha != currentHead))
728  {
729  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), false, ct).ConfigureAwait(false);
730  await UpdateRevInfo().ConfigureAwait(false);
731  }
732  await databaseContext.Save(ct).ConfigureAwait(false);
733  }
734  catch
735  {
736  doneSteps = 0;
737  numSteps = 2;
738  //the stuff didn't make it into the db, forget what we've done and abort
739  await repo.CheckoutObject(startReference ?? startSha, NextProgressReporter(), default).ConfigureAwait(false);
740  if (startReference != null && repo.Head != startSha)
741  await repo.ResetToSha(startSha, NextProgressReporter(), default).ConfigureAwait(false);
742  else
743  progressReporter(100);
744  throw;
745  }
746  }
747  }, cancellationToken).ConfigureAwait(false);
748 
749  api.ActiveJob = job.ToApi();
750  return Accepted(api);
751  }
string Name
The name of the User
Definition: User.cs:38
+ +
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
+ +
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 , 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
+ +
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the RepositoryController
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Controllers.RepositoryController.generalConfiguration
+
+private
+
+ +

The GeneralConfiguration for the RepositoryController

+ +

Definition at line 49 of file RepositoryController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Controllers.RepositoryController.gitHubClientFactory
+
+private
+
+ +

The IGitHubClientFactory for the RepositoryController

+ +

Definition at line 39 of file RepositoryController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.RepositoryController.instanceManager
+
+private
+
+ +

The IInstanceManager for the RepositoryController

+ +

Definition at line 34 of file RepositoryController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.RepositoryController.jobManager
+
+private
+
+ +

The IJobManager for the RepositoryController

+ +

Definition at line 44 of file RepositoryController.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_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..b5955968d8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html @@ -0,0 +1,398 @@ + + + + + + +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 11 of file TgsAuthorizeAttribute.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute ()
+
+ +

Construct a TgsAuthorizeAttribute

+ +

Definition at line 16 of file TgsAuthorizeAttribute.cs.

+
16 { }
+
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (AdministrationRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for AdministrationRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (InstanceManagerRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for InstanceManagerRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (RepositoryRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for RepositoryRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (ByondRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for ByondRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (DreamMakerRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for DreamMakerRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (DreamDaemonRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for DreamDaemonRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (ChatBotRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for ChatBotRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (ConfigurationRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for ConfigurationRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (InstanceUserRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for InstanceUserRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +
+
+
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..4673c6ea6e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html @@ -0,0 +1,559 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 ILogger< UserController > logger
The ILogger for the UserController
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserController
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.Create ([FromBody] UserUpdate model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 66 of file UserController.cs.

+ +

References Tgstation.Server.Api.Models.Internal.User.Enabled, Tgstation.Server.Api.Rights.List, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+
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
+
InstanceManagerRights InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+ +
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the UserController
+
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
+ +
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
+
bool Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled ...
Definition: User.cs:21
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+
uint MinimumPasswordLength
Minimum length of database user passwords
+
AdministrationRights AdministrationRights
The Rights.AdministrationRights for the User
Definition: User.cs:44
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Api.Rights.Read, Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+
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  }
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< UserUpdate >.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.Update ([FromBody] UserUpdate model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 126 of file UserController.cs.

+ +

References Tgstation.Server.Api.Models.Internal.User.AdministrationRights, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Rights.Read, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+
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
+
InstanceManagerRights InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+ +
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the UserController
+
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
+ +
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
+
bool Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled ...
Definition: User.cs:21
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+
AdministrationRights AdministrationRights
The Rights.AdministrationRights for the User
Definition: User.cs:44
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Controllers.UserController.cryptographySuite
+
+private
+
+ +

The ICryptographySuite for the UserController

+ +

Definition at line 35 of file UserController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Controllers.UserController.generalConfiguration
+
+private
+
+ +

The GeneralConfiguration for the UserController

+ +

Definition at line 45 of file UserController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<UserController> Tgstation.Server.Host.Controllers.UserController.logger
+
+private
+
+ +

The ILogger for the UserController

+ +

Definition at line 40 of file UserController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISystemIdentityFactory Tgstation.Server.Host.Controllers.UserController.systemIdentityFactory
+
+private
+
+ +

The ISystemIdentityFactory for the UserController

+ +

Definition at line 30 of file UserController.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_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..f20e8b7cf3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application-members.html @@ -0,0 +1,120 @@ + + + + + + +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, 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..b3a42c2785 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html @@ -0,0 +1,569 @@ + + + + + + +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, 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 37 of file Application.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 73 of file Application.cs.

+
74  {
75  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
76  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
77 
78  startupTcs = new TaskCompletionSource<object>();
79 
80  Version = Assembly.GetExecutingAssembly().GetName().Version;
81  VersionString = String.Format(CultureInfo.InvariantCulture, "{0} v{1}", VersionPrefix, Version);
82  }
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment
The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application
Definition: Application.cs:56
+ + +
readonly TaskCompletionSource< object > startupTcs
The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception) ...
Definition: Application.cs:61
+ +
readonly IConfiguration configuration
The IConfiguration for the Application
Definition: Application.cs:51
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Core.Application.Configure (IApplicationBuilder applicationBuilder,
IServerControl serverControl,
ITokenFactory tokenFactory,
ILogger< Applicationlogger 
)
+
+ +

Configure the Application

+
Parameters
+ + + + + +
applicationBuilderThe IApplicationBuilder to configure
serverControlThe IServerControl for the Application
tokenFactoryThe value of tokenFactory
loggerThe Microsoft.Extensions.Logging.ILogger for the Application
+
+
+

inheritdoc />

+ +

Definition at line 315 of file Application.cs.

+ +

References Tgstation.Server.Host.Core.IServerControl.Restart(), and Tgstation.Server.Host.Core.IServerControl.WatchdogPresent.

+ +
+
+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Core.Application.ConfigureServices (IServiceCollection services)
+
+ +

Configure dependency injected services

+
Parameters
+ + +
servicesThe IServiceCollection to configure
+
+
+ +

Definition at line 88 of file Application.cs.

+ +

References Tgstation.Server.Host.Core.ISetupWizard.CheckRunWizard(), Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Configuration.DatabaseConfiguration.DatabaseType, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Directory, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Disable, Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.LogLevel, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.MicrosoftLogLevel, Tgstation.Server.Host.Configuration.UpdatesConfiguration.Section, Tgstation.Server.Host.Configuration.GeneralConfiguration.Section, Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Section, and Tgstation.Server.Host.Security.ITokenFactory.ValidationParameters.

+
89  {
90  if (services == null)
91  throw new ArgumentNullException(nameof(services));
92 
93  //needful
94  services.AddSingleton<IApplication>(this);
95 
96  //configure configuration
97  services.Configure<UpdatesConfiguration>(configuration.GetSection(UpdatesConfiguration.Section));
98  services.Configure<DatabaseConfiguration>(configuration.GetSection(DatabaseConfiguration.Section));
99  services.Configure<GeneralConfiguration>(configuration.GetSection(GeneralConfiguration.Section));
101 
102  //enable options which give us config reloading
103  services.AddOptions();
104 
105  //other stuff needed for for setup wizard and configuration
106  services.AddSingleton<IIOManager, DefaultIOManager>();
107  services.AddSingleton<IConsole, IO.Console>();
108  services.AddSingleton<IDBConnectionFactory, DBConnectionFactory>();
109  services.AddSingleton<ISetupWizard, SetupWizard>();
110  services.AddSingleton<IPlatformIdentifier, PlatformIdentifier>();
111  services.AddSingleton<IAsyncDelayer, AsyncDelayer>();
112 
113  GeneralConfiguration generalConfiguration;
114  DatabaseConfiguration databaseConfiguration;
115  FileLoggingConfiguration fileLoggingConfiguration;
116  IIOManager ioManager;
117  IPlatformIdentifier platformIdentifier;
118 
119  //temporarily build the service provider in it's current state
120  //do it here so we can run the setup wizard if necessary
121  //also allows us to get some options and other services we need for continued configuration
122  using (var provider = services.BuildServiceProvider())
123  {
124  //run the wizard if necessary
125  var setupWizard = provider.GetRequiredService<ISetupWizard>();
126  var applicationLifetime = provider.GetRequiredService<Microsoft.AspNetCore.Hosting.IApplicationLifetime>();
127  var setupWizardRan = setupWizard.CheckRunWizard(applicationLifetime.ApplicationStopping).GetAwaiter().GetResult();
128 
129  //load the configuration options we need
130  var generalOptions = provider.GetRequiredService<IOptions<GeneralConfiguration>>();
131  generalConfiguration = generalOptions.Value;
132 
133  //unless this is set, in which case, we leave
134  if (setupWizardRan && generalConfiguration.SetupWizardMode == SetupWizardMode.Only)
135  //we don't inject a logger in the constuctor to log this because it's not yet configured
136  throw new OperationCanceledException("Exiting due to SetupWizardMode configuration!");
137 
138  var dbOptions = provider.GetRequiredService<IOptions<DatabaseConfiguration>>();
139  databaseConfiguration = dbOptions.Value;
140 
141  var loggingOptions = provider.GetRequiredService<IOptions<FileLoggingConfiguration>>();
142  fileLoggingConfiguration = loggingOptions.Value;
143 
144  ioManager = provider.GetRequiredService<IIOManager>();
145  platformIdentifier = provider.GetRequiredService<IPlatformIdentifier>();
146  }
147 
148  //setup file logging via serilog
149  if (!fileLoggingConfiguration.Disable)
150  services.AddLogging(builder =>
151  {
152  //common app data is C:/ProgramData on windows, else /usr/shar
153  var logPath = !String.IsNullOrEmpty(fileLoggingConfiguration.Directory) ? fileLoggingConfiguration.Directory : ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), VersionPrefix, "Logs");
154 
155  logPath = ioManager.ConcatPath(logPath, "tgs-{Date}.log");
156 
157  LogEventLevel? ConvertLogLevel(LogLevel logLevel)
158  {
159  switch (logLevel)
160  {
161  case LogLevel.Critical:
162  return LogEventLevel.Fatal;
163  case LogLevel.Debug:
164  return LogEventLevel.Debug;
165  case LogLevel.Error:
166  return LogEventLevel.Error;
167  case LogLevel.Information:
168  return LogEventLevel.Information;
169  case LogLevel.Trace:
170  return LogEventLevel.Verbose;
171  case LogLevel.Warning:
172  return LogEventLevel.Warning;
173  case LogLevel.None:
174  return null;
175  default:
176  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid log level {0}", logLevel));
177  }
178  };
179 
180  var logEventLevel = ConvertLogLevel(fileLoggingConfiguration.LogLevel);
181  var microsoftEventLevel = ConvertLogLevel(fileLoggingConfiguration.MicrosoftLogLevel);
182 
183  var formatter = new MessageTemplateTextFormatter("{Timestamp:o} {RequestId,13} [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}", null);
184 
185  var configuration = new LoggerConfiguration()
186  .Enrich.FromLogContext()
187  .WriteTo.Async(w => w.RollingFile(formatter, logPath, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(2)));
188 
189  if (logEventLevel.HasValue)
190  configuration.MinimumLevel.Is(logEventLevel.Value);
191 
192  if (microsoftEventLevel.HasValue)
193  configuration.MinimumLevel.Override("Microsoft", microsoftEventLevel.Value);
194 
195  builder.AddSerilog(configuration.CreateLogger(), true);
196  });
197 
198  //configure bearer token validation
199  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(jwtBearerOptions =>
200  {
201  //this line isn't actually run until the first request is made
202  //at that point tokenFactory will be populated
203  jwtBearerOptions.TokenValidationParameters = tokenFactory.ValidationParameters;
204  jwtBearerOptions.Events = new JwtBearerEvents
205  {
206  //Application is our composition root so this monstrosity of a line is okay
207  OnTokenValidated = ctx => ctx.HttpContext.RequestServices.GetRequiredService<IClaimsInjector>().InjectClaimsIntoContext(ctx, ctx.HttpContext.RequestAborted)
208  };
209  });
210  //fucking converts 'sub' to M$ bs
211  //can't be done in the above lambda, that's too late
212  JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
213 
214  //add mvc, configure the json serializer settings
215  services.AddMvc().AddJsonOptions(options =>
216  {
217  options.AllowInputFormatterExceptionMessages = true;
218  options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
219  options.SerializerSettings.CheckAdditionalContent = true;
220  options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
221  options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
222  options.SerializerSettings.Converters = new[] { new VersionConverter() };
223  });
224 
225  void AddTypedContext<TContext>() where TContext : DatabaseContext<TContext>
226  {
227  services.AddDbContext<TContext>(builder =>
228  {
229  if (hostingEnvironment.IsDevelopment())
230  builder.EnableSensitiveDataLogging();
231  });
232  services.AddScoped<IDatabaseContext>(x => x.GetRequiredService<TContext>());
233  }
234 
235  //add the correct database context type
236  var dbType = databaseConfiguration.DatabaseType;
237  switch (dbType)
238  {
239  case DatabaseType.MySql:
240  case DatabaseType.MariaDB:
241  AddTypedContext<MySqlDatabaseContext>();
242  break;
243  case DatabaseType.SqlServer:
244  AddTypedContext<SqlServerDatabaseContext>();
245  break;
246  default:
247  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid {0}: {1}!", nameof(DatabaseType), dbType));
248  }
249 
250  //configure other database services
251  services.AddSingleton<IDatabaseContextFactory, DatabaseContextFactory>();
252  services.AddSingleton<IDatabaseSeeder, DatabaseSeeder>();
253 
254  //configure security services
256  services.AddScoped<IClaimsInjector, ClaimsInjector>();
257  services.AddSingleton<IIdentityCache, IdentityCache>();
258  services.AddSingleton<ICryptographySuite, CryptographySuite>();
259  services.AddSingleton<ITokenFactory, TokenFactory>();
260  services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
261 
262  //configure platform specific services
263  if (platformIdentifier.IsWindows)
264  {
265  services.AddSingleton<ISystemIdentityFactory, WindowsSystemIdentityFactory>();
266  services.AddSingleton<ISymlinkFactory, WindowsSymlinkFactory>();
267  services.AddSingleton<IByondInstaller, WindowsByondInstaller>();
268  services.AddSingleton<IPostWriteHandler, WindowsPostWriteHandler>();
269 
270  services.AddSingleton<WindowsNetworkPromptReaper>();
271  services.AddSingleton<INetworkPromptReaper>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
272  services.AddSingleton<IHostedService>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
273  }
274  else
275  {
276  services.AddSingleton<ISystemIdentityFactory, PosixSystemIdentityFactory>();
277  services.AddSingleton<ISymlinkFactory, PosixSymlinkFactory>();
278  services.AddSingleton<IByondInstaller, PosixByondInstaller>();
279  services.AddSingleton<IPostWriteHandler, PosixPostWriteHandler>();
280  services.AddSingleton<INetworkPromptReaper, PosixNetworkPromptReaper>();
281  }
282 
283  //configure misc services
284  services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
285  services.AddSingleton<IGitHubClientFactory, GitHubClientFactory>();
286  services.AddSingleton<IProcessExecutor, ProcessExecutor>();
287  services.AddSingleton<IByondTopicSender>(new ByondTopicSender
288  {
289  ReceiveTimeout = generalConfiguration.ByondTopicTimeout,
290  SendTimeout = generalConfiguration.ByondTopicTimeout
291  });
292 
293  //configure component services
294  services.AddSingleton<ICredentialsProvider, CredentialsProvider>();
295  services.AddSingleton<IProviderFactory, ProviderFactory>();
296  services.AddSingleton<IChatFactory, ChatFactory>();
297  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
298  services.AddSingleton<IInstanceFactory, InstanceFactory>();
299 
300  //configure root services
301  services.AddSingleton<InstanceManager>();
302  services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
303  services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
304 
305  services.AddSingleton<IJobManager, JobManager>();
306  }
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:56
+
IPostWriteHandler for POSIX systems
+
+ + + +
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:66
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+
For initially seeding a database
+ + + + +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+
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
+ + + + +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the UpdatesConfiguration res...
+ +
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
+ + +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the FileLoggingConfiguration...
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
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
+ + +
readonly IConfiguration configuration
The IConfiguration for the Application
Definition: Application.cs:51
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + + + +
+
+
+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Core.Application.Ready (Exception initializationError)
+
+ +

Mark the IApplication as ready to run

+
Parameters
+ + +
initializationErrorThe Exception that put the application in a corrupted state if any
+
+
+ +

Implements Tgstation.Server.Host.Core.IApplication.

+ +

Definition at line 361 of file Application.cs.

+
362  {
363  lock (startupTcs)
364  {
365  if (startupTcs.Task.IsCompleted)
366  throw new InvalidOperationException("Ready has already been called!");
367  if (initializationError == null)
368  startupTcs.SetResult(null);
369  else
370  startupTcs.SetException(initializationError);
371  }
372  }
readonly TaskCompletionSource< object > startupTcs
The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception) ...
Definition: Application.cs:61
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IConfiguration Tgstation.Server.Host.Core.Application.configuration
+
+private
+
+ +

The IConfiguration for the Application

+ +

Definition at line 51 of file Application.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment Tgstation.Server.Host.Core.Application.hostingEnvironment
+
+private
+
+ +

The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application

+ +

Definition at line 56 of file Application.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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 61 of file Application.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ITokenFactory Tgstation.Server.Host.Core.Application.tokenFactory
+
+private
+
+ +

The ITokenFactory for the Application

+ +

Definition at line 66 of file Application.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Core.Application.VersionPrefix => "tgstation-server"
+
+ +

+ +

Definition at line 40 of file Application.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Core.Application.Version
+
+get
+
+ +

+ +

Definition at line 43 of file Application.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.Application.VersionString
+
+get
+
+ +

+ +

Definition at line 46 of file Application.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_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..1c2a139895 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions-members.html @@ -0,0 +1,112 @@ + + + + + + +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..e6c138e928 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html @@ -0,0 +1,241 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + + +
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
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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
+
+
+
+
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..90f5475ca8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer-members.html @@ -0,0 +1,110 @@ + + + + + + +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..c839a8e46b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html @@ -0,0 +1,165 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.AsyncDelayer.Delay (TimeSpan timeSpan,
CancellationToken cancellationToken 
)
+
+ +

Create a Task that completes after a given timeSpan

+ +

Implements Tgstation.Server.Host.Core.IAsyncDelayer.

+ +
+
+
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..c7bb68c3b3 --- /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,110 @@ + + + + + + +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..ccbdeccaf9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html @@ -0,0 +1,168 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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..893bbe0395 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html @@ -0,0 +1,223 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IServiceScopeFactory Tgstation.Server.Host.Core.DatabaseContextFactory.scopeFactory
+
+private
+
+ +

The IServiceScopeFactory for the DatabaseContextFactory

+ +

Definition at line 14 of file DatabaseContextFactory.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_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..485a354798 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html @@ -0,0 +1,276 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
GitHubClient Tgstation.Server.Host.Core.GitHubClientFactory.CreateBaseClient ()
+
+private
+
+ +

Create a GitHubClient

+
Returns
A new GitHubClient
+ +
+
+ +
+
+ + + + + + + +
IGitHubClient Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient ()
+
+ +

Create a client with anonymous authentication. Low rate limit

+ +

Implements Tgstation.Server.Host.Core.IGitHubClientFactory.

+ +
+
+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Core.GitHubClientFactory.application
+
+private
+
+ +

The IApplication for the GitHubClientFactory

+ +

Definition at line 12 of file GitHubClientFactory.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_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..77ca37c1b1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html @@ -0,0 +1,224 @@ + + + + + + +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:
+
+
+ + +Exception + +
+ + + + + + + + + + + +

+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

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Core.JobException.JobException ()
+
+ +

Construct a JobException

+ +

Definition at line 13 of file JobException.cs.

+
14  {
15  }
+
+
+ +
+
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..39beaacdc1690d67a2262e4ff7aab12e1cd130dc GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^-+(xPgBeK5c2;l#DTx4|5ZC|z{{xvX-h3_XKQsZz z0^GuI!9^Y7o1H}k&V%es5(u3HwqbtIw{MYu^H%@hJ+7)tC*|w6O|EC%rZV^C zFaELw?@QHBM4~6%TLgE6^|wtr-PVkIyv-TvKXumb-udKPXYKNDC*F!!TUj>9vzj%C z6ORup_0m+WS7NLPPGGJG1mR=nc=FcP^XlrJ z*oQn_HQTngx1ICe&Ti{ud;9kD8`~z&PP}Qfb&<(mdKI;Vst0Mj~8hyVZp 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..9ba19c1217 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler-members.html @@ -0,0 +1,116 @@ + + + + + + +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..626577dc2e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html @@ -0,0 +1,333 @@ + + + + + + +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 ()
 <inehritdoc> More...
 
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

+ +
+
+ + + + + + + + +
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 25 of file JobHandler.cs.

+
26  {
27  if (job == null)
28  throw new ArgumentNullException(nameof(job));
29  cancellationTokenSource = new CancellationTokenSource();
30  task = job(cancellationTokenSource.Token);
31  }
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for task
Definition: JobHandler.cs:15
+
readonly Task task
The Task being run
Definition: JobHandler.cs:19
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.JobHandler.Cancel ()
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.JobHandler.Dispose ()
+
+
+ +
+
+ + + + + + + + +
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 46 of file JobHandler.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.CancelJob(), and Tgstation.Server.Host.Core.JobManager.WaitForJobCompletion().

+
47  {
48  TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
49  using (cancellationToken.Register(() => tcs.SetCanceled()))
50  await Task.WhenAny(tcs.Task, task).ConfigureAwait(false);
51  cancellationToken.ThrowIfCancellationRequested();
52  }
readonly Task task
The Task being run
Definition: JobHandler.cs:19
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Core.JobHandler.cancellationTokenSource
+
+private
+
+ +

The CancellationTokenSource for task

+ +

Definition at line 15 of file JobHandler.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Task Tgstation.Server.Host.Core.JobHandler.task
+
+private
+
+ +

The Task being run

+ +

Definition at line 19 of file JobHandler.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Core.JobHandler.Progress
+
+getset
+
+ +

The progress of the job

+ +

Definition at line 39 of file JobHandler.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_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..93f5431a01 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html @@ -0,0 +1,630 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 219 of file JobManager.cs.

+ +

References Tgstation.Server.Host.Core.JobHandler.Cancel(), Tgstation.Server.Host.Models.Job.CancelledBy, Tgstation.Server.Api.Models.Internal.Job.Id, Tgstation.Server.Api.Models.Internal.User.Id, and Tgstation.Server.Host.Core.JobHandler.Wait().

+
220  {
221  if (job == null)
222  throw new ArgumentNullException(nameof(job));
223  if (user == null)
224  throw new ArgumentNullException(nameof(user));
225  JobHandler handler;
226  try
227  {
228  handler = CheckGetJob(job);
229  }
230  catch (InvalidOperationException)
231  {
232  //this is fine
233  return false;
234  }
235  handler.Cancel(); //this will ensure the db update is only done once
236  await databaseContextFactory.UseContext(async databaseContext =>
237  {
238  job = new Job { Id = job.Id };
239  databaseContext.Jobs.Attach(job);
240  user = new User { Id = user.Id };
241  databaseContext.Users.Attach(user);
242  job.CancelledBy = user;
243  //let either startup or cancellation set job.cancelled
244  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
245  }).ConfigureAwait(false);
246  if (blocking)
247  await handler.Wait(cancellationToken).ConfigureAwait(false);
248  return true;
249  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Internal.Job.Id.

+
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
+ +
+
+
+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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 252 of file JobManager.cs.

+ +

References Tgstation.Server.Api.Models.Internal.Job.Id.

+
253  {
254  if (job == null)
255  throw new ArgumentNullException(nameof(job));
256  lock (this)
257  {
258  if (!jobs.TryGetValue(job.Id, out var handler))
259  return null;
260  return handler.Progress;
261  }
262  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Internal.Job.Cancelled, Tgstation.Server.Api.Models.Internal.Job.Description, Tgstation.Server.Api.Models.Internal.Job.ExceptionDetails, Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.Job.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Models.Job.Instance, Tgstation.Server.Host.Models.Job.PostComplete, Tgstation.Server.Api.Models.Internal.Job.StartedAt, Tgstation.Server.Host.Models.Job.StartedBy, and Tgstation.Server.Api.Models.Internal.Job.StoppedAt.

+
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
+
DateTimeOffset StoppedAt
When the Job stopped
Definition: Job.cs:37
+
string ExceptionDetails
Details of any exceptions caught during the Job
Definition: Job.cs:26
+
Func< CancellationToken, Task > PostComplete
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
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
+
bool Cancelled
If the Job was cancelled
Definition: Job.cs:43
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.JobManager.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 184 of file JobManager.cs.

+ +

References Tgstation.Server.Api.Models.Internal.Job.Cancelled.

+
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  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
202  }
203  }).ConfigureAwait(false);
204  logger.LogDebug("Job manager started!");
205  }
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
+
bool Cancelled
If the Job was cancelled
Definition: Job.cs:43
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.JobManager.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 208 of file JobManager.cs.

+
209  {
210  var joinTasks = jobs.Select(x =>
211  {
212  x.Value.Cancel();
213  return x.Value.Wait(cancellationToken);
214  });
215  await Task.WhenAll(joinTasks).ConfigureAwait(false);
216  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 265 of file JobManager.cs.

+ +

References Tgstation.Server.Api.Models.Internal.Job.Id, and Tgstation.Server.Host.Core.JobHandler.Wait().

+
266  {
267  if (job == null)
268  throw new ArgumentNullException(nameof(job));
269  if (canceller == null)
270  throw new ArgumentNullException(nameof(canceller));
271  JobHandler handler;
272  lock (this)
273  {
274  if (!jobs.TryGetValue(job.Id, out handler))
275  return;
276  }
277  Task cancelTask = null;
278  using (jobCancellationToken.Register(() => cancelTask = CancelJob(job, canceller, true, cancellationToken)))
279  await handler.Wait(cancellationToken).ConfigureAwait(false);
280 
281  if (cancelTask != null)
282  await cancelTask.ConfigureAwait(false);
283  }
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:219
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Core.JobManager.databaseContextFactory
+
+private
+
+ +

The IServiceProvider for the JobManager

+ +

Definition at line 18 of file JobManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<long, JobHandler> Tgstation.Server.Host.Core.JobManager.jobs
+
+private
+
+ +

Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers

+ +

Definition at line 28 of file JobManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<JobManager> Tgstation.Server.Host.Core.JobManager.logger
+
+private
+
+ +

The ILogger for the JobManager

+ +

Definition at line 23 of file JobManager.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_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..7ce58f839c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html @@ -0,0 +1,220 @@ + + + + + + +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

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Core.PlatformIdentifier.PlatformIdentifier ()
+
+ +

Construct a PlatformIdentifier

+ +

Definition at line 17 of file PlatformIdentifier.cs.

+
18  {
19  IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
20  ScriptFileExtension = IsWindows ? "bat" : "sh";
21  }
+ +
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.PlatformIdentifier.IsWindows
+
+get
+
+ +

+ +

Definition at line 9 of file PlatformIdentifier.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.PlatformIdentifier.ScriptFileExtension
+
+get
+
+ +

+ +

Definition at line 12 of file PlatformIdentifier.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_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..0835577334 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html @@ -0,0 +1,576 @@ + + + + + + +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)
 
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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Core.Process.Process (System.Diagnostics.Process handle,
Task< int > lifetime,
StringBuilder outputStringBuilder,
StringBuilder errorStringBuilder,
StringBuilder combinedStringBuilder,
ILogger< Processlogger,
bool preExisting 
)
+
+ +

Definition at line 31 of file Process.cs.

+
32  {
33  this.handle = handle ?? throw new ArgumentNullException(nameof(handle));
34  Lifetime = lifetime ?? throw new ArgumentNullException(nameof(lifetime));
35 
39 
40  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
41 
42  Id = handle.Id;
43 
44  if (preExisting)
45  {
46  Startup = Task.CompletedTask;
47  return;
48  }
49 
50  Startup = Task.Factory.StartNew(() =>
51  {
52  try
53  {
54  handle.WaitForInputIdle();
55  }
56  catch (InvalidOperationException) { }
57  }, default, TaskCreationOptions.LongRunning, TaskScheduler.Current);
58 
59  logger.LogTrace("Created process ID: {0}", Id);
60  }
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Process.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + + + +
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 66 of file Process.cs.

+
67  {
68  if (combinedStringBuilder == null)
69  throw new InvalidOperationException("Output/Error reading was not enabled!");
70  return combinedStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
71  }
readonly StringBuilder combinedStringBuilder
Definition: Process.cs:24
+
+
+
+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.Process.GetErrorOutput ()
+
+ +

Get the stderr output of the IProcess

+ +

Implements Tgstation.Server.Host.Core.IProcess.

+ +

Definition at line 74 of file Process.cs.

+
75  {
76  if (errorStringBuilder == null)
77  throw new InvalidOperationException("Error reading was not enabled!");
78  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
79  }
readonly StringBuilder errorStringBuilder
Definition: Process.cs:23
+
+
+
+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.Process.GetStandardOutput ()
+
+ +

Get the stdout output of the IProcess

+ +

Implements Tgstation.Server.Host.Core.IProcess.

+ +

Definition at line 82 of file Process.cs.

+
83  {
84  if (outputStringBuilder == null)
85  throw new InvalidOperationException("Output reading was not enabled!");
86  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
87  }
readonly StringBuilder errorStringBuilder
Definition: Process.cs:23
+
readonly StringBuilder outputStringBuilder
Definition: Process.cs:22
+
+
+
+ +
+
+ + + + + + + +
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 106 of file Process.cs.

+
107  {
108  try
109  {
110  handle.PriorityClass = System.Diagnostics.ProcessPriorityClass.AboveNormal;
111  logger.LogTrace("Set to above normal priority", handle.Id);
112  }
113  catch (Exception e)
114  {
115  logger.LogWarning("Unable to raise process priority! Exception: {0}", e);
116  }
117  }
+ + +
readonly ILogger< Process > logger
The ILogger for the Process
Definition: Process.cs:29
+
readonly System.Diagnostics.Process handle
Definition: Process.cs:20
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Process.Terminate ()
+
+ +

Terminates the process

+ +

Implements Tgstation.Server.Host.Core.IProcess.

+ +

Definition at line 90 of file Process.cs.

+
91  {
92  if (handle.HasExited)
93  return;
94  try
95  {
96  logger.LogTrace("Terminating process...");
97  handle.Kill();
98  handle.WaitForExit();
99  }
100  catch (Exception e)
101  {
102  logger.LogDebug("Process termination exception: {0}", e);
103  }
104  }
+
readonly ILogger< Process > logger
The ILogger for the Process
Definition: Process.cs:29
+
readonly System.Diagnostics.Process handle
Definition: Process.cs:20
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly StringBuilder Tgstation.Server.Host.Core.Process.combinedStringBuilder
+
+private
+
+ +

Definition at line 24 of file Process.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly StringBuilder Tgstation.Server.Host.Core.Process.errorStringBuilder
+
+private
+
+ +

Definition at line 23 of file Process.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly System.Diagnostics.Process Tgstation.Server.Host.Core.Process.handle
+
+private
+
+ +

Definition at line 20 of file Process.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Process> Tgstation.Server.Host.Core.Process.logger
+
+private
+
+ +

The ILogger for the Process

+ +

Definition at line 29 of file Process.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly StringBuilder Tgstation.Server.Host.Core.Process.outputStringBuilder
+
+private
+
+ +

Definition at line 22 of file Process.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Core.Process.Id
+
+get
+
+ +

+ +

Definition at line 12 of file Process.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task<int> Tgstation.Server.Host.Core.Process.Lifetime
+
+get
+
+ +

+ +

Definition at line 18 of file Process.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Core.Process.Startup
+
+get
+
+ +

+ +

Definition at line 15 of file Process.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_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..1cb3821621 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor-members.html @@ -0,0 +1,115 @@ + + + + + + +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..dc96fefe61 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html @@ -0,0 +1,369 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 51 of file ProcessExecutor.cs.

+
52  {
53  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
54  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
55  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProcessExecutor
+
readonly ILogger< ProcessExecutor > logger
The ILogger for the ProcessExecutor
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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  tcs.SetResult(exitCode);
42  };
43  return tcs.Task;
44  }
+
+
+ +
+
+ + + + + + + + +
IProcess Tgstation.Server.Host.Core.ProcessExecutor.GetProcess (int id)
+
+ +

Get a IProcess by id

+ +

Implements Tgstation.Server.Host.Core.IProcessExecutor.

+ +

Definition at line 58 of file ProcessExecutor.cs.

+
59  {
60  logger.LogDebug("Attaching to process {0}...", id);
61  System.Diagnostics.Process handle;
62  try
63  {
64  handle = System.Diagnostics.Process.GetProcessById(id);
65  }
66  catch(Exception e)
67  {
68  logger.LogDebug("Unable to get process {0}! Exception: {1}", id, e);
69  return null;
70  }
71  try
72  {
73  return new Process(handle, AttachExitHandler(handle), null, null, null, loggerFactory.CreateLogger<Process>(), true);
74  }
75  catch
76  {
77  handle.Dispose();
78  throw;
79  }
80  }
+
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 83 of file ProcessExecutor.cs.

+
84  {
85  logger.LogDebug("Launching process in {0}: {1} {2}", workingDirectory, fileName, arguments);
86  var handle = new System.Diagnostics.Process();
87  try
88  {
89  handle.StartInfo.FileName = fileName;
90  handle.StartInfo.Arguments = arguments;
91  handle.StartInfo.WorkingDirectory = workingDirectory;
92 
93  handle.StartInfo.UseShellExecute = !(noShellExecute || readOutput || readError);
94 
95  StringBuilder outputStringBuilder = null, errorStringBuilder = null, combinedStringBuilder = null;
96  if (readOutput || readError)
97  {
98  combinedStringBuilder = new StringBuilder();
99  if (readOutput)
100  {
101  outputStringBuilder = new StringBuilder();
102  handle.StartInfo.RedirectStandardOutput = true;
103  handle.OutputDataReceived += (sender, e) =>
104  {
105  combinedStringBuilder.Append(Environment.NewLine);
106  combinedStringBuilder.Append(e.Data);
107  outputStringBuilder.Append(Environment.NewLine);
108  outputStringBuilder.Append(e.Data);
109  };
110  }
111  if (readError)
112  {
113  errorStringBuilder = new StringBuilder();
114  handle.StartInfo.RedirectStandardError = true;
115  handle.ErrorDataReceived += (sender, e) =>
116  {
117  combinedStringBuilder.Append(Environment.NewLine);
118  combinedStringBuilder.Append(e.Data);
119  errorStringBuilder.Append(Environment.NewLine);
120  errorStringBuilder.Append(e.Data);
121  };
122  }
123  }
124 
125  var lifetimeTask = AttachExitHandler(handle);
126 
127  handle.Start();
128  try
129  {
130  if (readOutput)
131  handle.BeginOutputReadLine();
132  }
133  catch (InvalidOperationException) { }
134  try
135  {
136  if (readError)
137  handle.BeginErrorReadLine();
138  }
139  catch (InvalidOperationException) { }
140 
141  return new Process(handle, lifetimeTask, outputStringBuilder, errorStringBuilder, combinedStringBuilder, loggerFactory.CreateLogger<Process>(), false);
142  }
143  catch
144  {
145  handle.Dispose();
146  throw;
147  }
148  }
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<ProcessExecutor> Tgstation.Server.Host.Core.ProcessExecutor.logger
+
+private
+
+ +

The ILogger for the ProcessExecutor

+ +

Definition at line 14 of file ProcessExecutor.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the ProcessExecutor

+ +

Definition at line 19 of file ProcessExecutor.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_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..e187c3f061 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration-members.html @@ -0,0 +1,112 @@ + + + + + + +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..40c70b2830 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html @@ -0,0 +1,215 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.RestartRegistration.Dispose ()
+
+ +

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly Action Tgstation.Server.Host.Core.RestartRegistration.onDispose
+
+private
+
+ +

The Dispose Action

+ +

Definition at line 11 of file RestartRegistration.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_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..af200cf022 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context-members.html @@ -0,0 +1,115 @@ + + + + + + +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..72db986eed --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html @@ -0,0 +1,340 @@ + + + + + + +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 ()
 Finalize the SemaphoreSlimContext 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

+ +
+
+ + + + + +
+ + + + + + + + +
Tgstation.Server.Host.Core.SemaphoreSlimContext.SemaphoreSlimContext (SemaphoreSlim lockedSemaphore)
+
+private
+
+ +

Construct a SemaphoreSlimContext

+
Parameters
+ + +
lockedSemaphoreThe value of lockedSemaphore
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Core.SemaphoreSlimContext.~SemaphoreSlimContext ()
+
+private
+
+ +

Finalize the SemaphoreSlimContext

+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.SemaphoreSlimContext.Dispose ()
+
+ +

Release the lock on lockedSemaphore

+ +

Definition at line 53 of file SemaphoreSlimContext.cs.

+
54  {
55  lock (this)
56  {
57  if (disposed)
58  return;
59  disposed = true;
60  }
61  GC.SuppressFinalize(this);
62  lockedSemaphore.Release();
63  }
readonly SemaphoreSlim lockedSemaphore
The locked SemaphoreSlim
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.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.Watchdog.HandleChatCommand(), Tgstation.Server.Host.Components.StaticFiles.Configuration.HandleEvent(), Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleEvent(), Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond(), Tgstation.Server.Host.Components.Watchdog.Watchdog.Launch(), Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory(), Tgstation.Server.Host.Components.Watchdog.Watchdog.MonitorLifetimes(), Tgstation.Server.Host.Components.StaticFiles.Configuration.Read(), Tgstation.Server.Host.Components.Watchdog.Watchdog.ResetRebootState(), Tgstation.Server.Host.Components.Watchdog.Watchdog.Restart(), Tgstation.Server.Host.Components.Chat.JsonTrackingContext.SetChannels(), Tgstation.Server.Host.Components.Watchdog.Watchdog.StartAsync(), Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo(), Tgstation.Server.Host.Components.Watchdog.Watchdog.Terminate(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Write().

+
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.SemaphoreSlimContext.disposed
+
+private
+
+ +

If Dispose has been called

+ +

Definition at line 35 of file SemaphoreSlimContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Core.SemaphoreSlimContext.lockedSemaphore
+
+private
+
+ +

The locked SemaphoreSlim

+ +

Definition at line 30 of file SemaphoreSlimContext.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_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_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..d462b8e696 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard-members.html @@ -0,0 +1,127 @@ + + + + + + +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
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, 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..671ccfadd2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html @@ -0,0 +1,910 @@ + + + + + + +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 SaveConfiguration (string userConfigFileName, ushort?hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 IApplication application
The IApplication for the SetupWizard
Definition: SetupWizard.cs:41
+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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 541 of file SetupWizard.cs.

+
542  {
543  var setupWizardMode = generalConfiguration.SetupWizardMode;
544  logger.LogTrace("Checking if setup wizard should run. SetupWizardMode: {0}", setupWizardMode);
545 
546  if (setupWizardMode == SetupWizardMode.Never)
547  {
548  logger.LogTrace("Skipping due to configuration...");
549  return false;
550  }
551 
552  var forceRun = setupWizardMode == SetupWizardMode.Force || setupWizardMode == SetupWizardMode.Only;
553  if (!console.Available)
554  {
555  if (forceRun)
556  throw new InvalidOperationException("Asked to run setup wizard with no console avaliable!");
557  logger.LogTrace("Skipping due to console not being available...");
558  return false;
559  }
560 
561  var userConfigFileName = String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.json", hostingEnvironment.EnvironmentName);
562  var exists = await ioManager.FileExists(userConfigFileName, cancellationToken).ConfigureAwait(false);
563 
564  bool shouldRunBasedOnAutodetect;
565  if (exists)
566  {
567  var bytes = await ioManager.ReadAllBytes(userConfigFileName, cancellationToken).ConfigureAwait(false);
568  var contents = Encoding.UTF8.GetString(bytes);
569  var existingConfigIsEmpty = String.IsNullOrWhiteSpace(contents);
570  logger.LogTrace("Configuration json detected. Empty: {0}", existingConfigIsEmpty);
571  shouldRunBasedOnAutodetect = existingConfigIsEmpty;
572  }
573  else
574  {
575  shouldRunBasedOnAutodetect = true;
576  logger.LogTrace("No configuration json detected");
577  }
578 
579 
580  if (!shouldRunBasedOnAutodetect)
581  {
582  if (forceRun)
583  {
584  logger.LogTrace("Asking user to bypass due to force run request...");
585  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);
586 
587  forceRun = await PromptYesNo("Continue running setup wizard? (y/n): ", cancellationToken).ConfigureAwait(false);
588  }
589  if (!forceRun)
590  return false;
591  }
592 
593  //flush the logs to prevent console conflicts
594  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
595 
596  await RunWizard(userConfigFileName, cancellationToken).ConfigureAwait(false);
597  return true;
598  }
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:520
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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  await console.WriteAsync("Invalid database type!", true, cancellationToken).ConfigureAwait(false);
162  }
163  while (true);
164 
165  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
166  await console.WriteAsync("Enter the server's address and port (blank for local): ", false, cancellationToken).ConfigureAwait(false);
167  var serverAddress = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
168  if (String.IsNullOrWhiteSpace(serverAddress))
169  serverAddress = null;
170 
171  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
172  await console.WriteAsync("Enter the database name (Can be from previous installation. Otherwise, should not exist): ", false, cancellationToken).ConfigureAwait(false);
173  string databaseName;
174 
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  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
210 
211  DbConnection testConnection;
212  void CreateTestConnection(string connectionString)
213  {
214  testConnection = dbConnectionFactory.CreateConnection(connectionString, databaseConfiguration.DatabaseType);
215  }
216 
217  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
218  {
219  var csb = new SqlConnectionStringBuilder
220  {
221  ApplicationName = application.VersionPrefix,
222  DataSource = serverAddress ?? "(local)"
223  };
224  if (useWinAuth)
225  csb.IntegratedSecurity = true;
226  else
227  {
228  csb.UserID = username;
229  csb.Password = password;
230  }
231 
232  CreateTestConnection(csb.ConnectionString);
233  csb.InitialCatalog = databaseName;
234  databaseConfiguration.ConnectionString = csb.ConnectionString;
235  }
236  else
237  {
238  var csb = new MySqlConnectionStringBuilder
239  {
240  Server = serverAddress ?? "127.0.0.1",
241  UserID = username,
242  Password = password
243  };
244 
245  CreateTestConnection(csb.ConnectionString);
246  csb.Database = databaseName;
247  databaseConfiguration.ConnectionString = csb.ConnectionString;
248  }
249 
250  try
251  {
252  using (testConnection)
253  {
254  await console.WriteAsync("Testing connection...", true, cancellationToken).ConfigureAwait(false);
255  await testConnection.OpenAsync(cancellationToken).ConfigureAwait(false);
256  await console.WriteAsync("Connection successful!", true, cancellationToken).ConfigureAwait(false);
257 
258  if (databaseConfiguration.DatabaseType != DatabaseType.SqlServer)
259  {
260  await console.WriteAsync("Checking MySQL/MariaDB version...", true, cancellationToken).ConfigureAwait(false);
261  using (var command = testConnection.CreateCommand())
262  {
263  command.CommandText = "SELECT VERSION()";
264  var fullVersion = (string)(await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false));
265  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Found {0}", fullVersion), true, cancellationToken).ConfigureAwait(false);
266  var splits = fullVersion.Split('-');
267  databaseConfiguration.MySqlServerVersion = splits[0];
268  }
269  }
270 
271  if (!dbExists)
272  {
273  await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false);
274  using (var command = testConnection.CreateCommand())
275  {
276  command.CommandText = String.Format(CultureInfo.InvariantCulture, "CREATE DATABASE {0}", databaseName);
277  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
278  }
279  await console.WriteAsync("Success!", true, cancellationToken).ConfigureAwait(false);
280  await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false);
281  using (var command = testConnection.CreateCommand())
282  {
283  command.CommandText = String.Format(CultureInfo.InvariantCulture, "DROP DATABASE {0}", databaseName);
284  try
285  {
286  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
287  }
288  catch (OperationCanceledException)
289  {
290  throw;
291  }
292  catch (Exception e)
293  {
294  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
295  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
296  await console.WriteAsync("This should be okay, but you may want to manually drop the database before continuing!", true, cancellationToken).ConfigureAwait(false);
297  await console.WriteAsync("Press any key to continue...", true, cancellationToken).ConfigureAwait(false);
298  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
299  }
300  }
301  }
302  }
303 
304  return databaseConfiguration;
305  }
306  catch (OperationCanceledException)
307  {
308  throw;
309  }
310  catch (Exception e)
311  {
312  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
313  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
314  await console.WriteAsync("Retrying database configuration...", true, cancellationToken).ConfigureAwait(false);
315  }
316  } while (true);
317  }
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 324 of file SetupWizard.cs.

+ +

References Tgstation.Server.Host.Configuration.GeneralConfiguration.MinimumPasswordLength.

+
325  {
326  var newGeneralConfiguration = new GeneralConfiguration
327  {
329  };
330  do
331  {
332  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
333  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Minimum database user password length (leave blank for default of {0}): ", newGeneralConfiguration.MinimumPasswordLength), false, cancellationToken).ConfigureAwait(false);
334  var passwordLengthString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
335  if (String.IsNullOrWhiteSpace(passwordLengthString))
336  break;
337  if (UInt32.TryParse(passwordLengthString, out var passwordLength) && passwordLength >= 0)
338  {
339  newGeneralConfiguration.MinimumPasswordLength = passwordLength;
340  break;
341  }
342  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
343  }
344  while (true);
345 
346  do
347  {
348  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
349  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);
350  var topicTimeoutString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
351  if (String.IsNullOrWhiteSpace(topicTimeoutString))
352  break;
353  if (Int32.TryParse(topicTimeoutString, out var topicTimeout) && topicTimeout >= 0)
354  {
355  newGeneralConfiguration.ByondTopicTimeout = topicTimeout;
356  break;
357  }
358  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
359  }
360  while (true);
361 
362  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
363  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);
364  await console.WriteAsync("GitHub personal access token: ", false, cancellationToken).ConfigureAwait(false);
365  newGeneralConfiguration.GitHubAccessToken = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
366  if (String.IsNullOrWhiteSpace(newGeneralConfiguration.GitHubAccessToken))
367  newGeneralConfiguration.GitHubAccessToken = null;
368  return newGeneralConfiguration;
369  }
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 376 of file SetupWizard.cs.

+
377  {
378  var fileLoggingConfiguration = new FileLoggingConfiguration();
379  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
380  fileLoggingConfiguration.Disable = !await PromptYesNo("Enable file logging? (y/n): ", cancellationToken).ConfigureAwait(false);
381 
382  if (!fileLoggingConfiguration.Disable)
383  {
384  do
385  {
386  await console.WriteAsync("Log file directory path (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
387  fileLoggingConfiguration.Directory = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
388  if (String.IsNullOrWhiteSpace(fileLoggingConfiguration.Directory))
389  {
390  fileLoggingConfiguration.Directory = null;
391  break;
392  }
393  //test a write of it
394  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
395  await console.WriteAsync("Testing directory access...", true, cancellationToken).ConfigureAwait(false);
396  try
397  {
398  await ioManager.CreateDirectory(fileLoggingConfiguration.Directory, cancellationToken).ConfigureAwait(false);
399  var testFile = ioManager.ConcatPath(fileLoggingConfiguration.Directory, String.Format(CultureInfo.InvariantCulture, "WizardAccesTest.{0}.deleteme", Guid.NewGuid()));
400  await ioManager.WriteAllBytes(testFile, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
401  try
402  {
403  await ioManager.DeleteFile(testFile, cancellationToken).ConfigureAwait(false);
404  }
405  catch (OperationCanceledException)
406  {
407  throw;
408  }
409  catch (Exception e)
410  {
411  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Error deleting test log file: {0}", testFile), true, cancellationToken).ConfigureAwait(false);
412  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
413  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
414  }
415  break;
416  }
417  catch (OperationCanceledException)
418  {
419  throw;
420  }
421  catch (Exception e)
422  {
423  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
424  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
425  await console.WriteAsync("Please verify the path is valid and you have access to it!", true, cancellationToken).ConfigureAwait(false);
426  }
427  } while (true);
428 
429  async Task<LogLevel?> PromptLogLevel(string question)
430  {
431  do
432  {
433  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
434  await console.WriteAsync(question, true, cancellationToken).ConfigureAwait(false);
435  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);
436  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
437  if (String.IsNullOrWhiteSpace(responseString))
438  return null;
439  if (Enum.TryParse<LogLevel>(responseString, out var logLevel) && logLevel != LogLevel.None)
440  return logLevel;
441  await console.WriteAsync("Invalid log level!", true, cancellationToken).ConfigureAwait(false);
442  } while (true);
443  }
444 
445  fileLoggingConfiguration.LogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for normal logs (default {0}).", fileLoggingConfiguration.LogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.LogLevel;
446  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;
447  }
448  return fileLoggingConfiguration;
449  }
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 if the user replied yes, 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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 520 of file SetupWizard.cs.

+
521  {
522  //welcome message
523  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
524  await console.WriteAsync("Welcome to tgstation-server 4!", true, cancellationToken).ConfigureAwait(false);
525  await console.WriteAsync("This wizard will help you configure your server.", true, cancellationToken).ConfigureAwait(false);
526 
527  var hostingPort = await PromptForHostingPort(cancellationToken).ConfigureAwait(false);
528 
529  var databaseConfiguration = await ConfigureDatabase(cancellationToken).ConfigureAwait(false);
530 
531  var newGeneralConfiguration = await ConfigureGeneral(cancellationToken).ConfigureAwait(false);
532 
533  var fileLoggingConfiguration = await ConfigureLogging(cancellationToken).ConfigureAwait(false);
534 
535  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
536 
537  await SaveConfiguration(userConfigFileName, hostingPort, databaseConfiguration, newGeneralConfiguration, fileLoggingConfiguration, cancellationToken).ConfigureAwait(false);
538  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
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 SaveConfiguration(string userConfigFileName, ushort?hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, CancellationToken cancellationToken)
Saves a given Configuration set to userConfigFileName
Definition: SetupWizard.cs:461
+
async Task< GeneralConfiguration > ConfigureGeneral(CancellationToken cancellationToken)
Prompts the user to create a GeneralConfiguration
Definition: SetupWizard.cs:324
+
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:376
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration (string userConfigFileName,
ushort? hostingPort,
DatabaseConfiguration databaseConfiguration,
GeneralConfiguration newGeneralConfiguration,
FileLoggingConfiguration fileLoggingConfiguration,
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
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 461 of file SetupWizard.cs.

+ +

References Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section, Tgstation.Server.Host.Configuration.GeneralConfiguration.Section, and Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Section.

+
462  {
463  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Configuration complete! Saving to {0}", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
464 
465  var map = new Dictionary<string, object>()
466  {
467  { DatabaseConfiguration.Section, databaseConfiguration },
468  { GeneralConfiguration.Section, newGeneralConfiguration },
469  { FileLoggingConfiguration.Section, fileLoggingConfiguration }
470  };
471 
472  if (hostingPort.HasValue)
473  map.Add("Kestrel", new
474  {
475  EndPoints = new
476  {
477  Http = new
478  {
479  Url = String.Format(CultureInfo.InvariantCulture, "http://0.0.0.0:{0}", hostingPort)
480  }
481  }
482  });
483 
484  var json = JsonConvert.SerializeObject(map, Formatting.Indented);
485  var configBytes = Encoding.UTF8.GetBytes(json);
486 
487  try
488  {
489  await ioManager.WriteAllBytes(userConfigFileName, configBytes, cancellationToken).ConfigureAwait(false);
490  }
491  catch (OperationCanceledException)
492  {
493  throw;
494  }
495  catch (Exception e)
496  {
497  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
498  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
499  await console.WriteAsync("For your convienence, here's the json we tried to write out:", true, cancellationToken).ConfigureAwait(false);
500  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
501  await console.WriteAsync(json, true, cancellationToken).ConfigureAwait(false);
502  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
503  await console.WriteAsync("Press any key to exit...", true, cancellationToken).ConfigureAwait(false);
504  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
505  throw new OperationCanceledException();
506  }
507 
508  await console.WriteAsync("Waiting for configuration changes to reload...", true, cancellationToken).ConfigureAwait(false);
509 
510  //we need to wait for the configuration's file system watcher to read and reload the changes
511  await asyncDelayer.Delay(TimeSpan.FromSeconds(5), cancellationToken).ConfigureAwait(false);
512  }
+
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
+
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Core.SetupWizard.application
+
+private
+
+ +

The IApplication for the SetupWizard

+ +

Definition at line 41 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Core.SetupWizard.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the SetupWizard

+ +

Definition at line 56 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IConsole Tgstation.Server.Host.Core.SetupWizard.console
+
+private
+
+ +

The IConsole for the SetupWizard

+ +

Definition at line 31 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDBConnectionFactory Tgstation.Server.Host.Core.SetupWizard.dbConnectionFactory
+
+private
+
+ +

The IDBConnectionFactory for the SetupWizard

+ +

Definition at line 46 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Core.SetupWizard.generalConfiguration
+
+private
+
+ +

The GeneralConfiguration for the SetupWizard

+ +

Definition at line 66 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IHostingEnvironment Tgstation.Server.Host.Core.SetupWizard.hostingEnvironment
+
+private
+
+ +

The IHostingEnvironment for the SetupWizard

+ +

Definition at line 36 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Core.SetupWizard.ioManager
+
+private
+
+ +

The IIOManager for the SetupWizard

+ +

Definition at line 26 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<SetupWizard> Tgstation.Server.Host.Core.SetupWizard.logger
+
+private
+
+ +

The ILogger for the SetupWizard

+ +

Definition at line 61 of file SetupWizard.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Core.SetupWizard.platformIdentifier
+
+private
+
+ +

The IPlatformIdentifier for the SetupWizard

+ +

Definition at line 51 of file SetupWizard.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_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.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..5104175d0b --- /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,173 @@ + + + + + + +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

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestApplication.TestConfigureServicesThrowsWhenSetupWizardConfigurationDemands ()
+
+ +

Definition at line 64 of file TestApplication.cs.

+
65  {
66  var mockConfiguration = new Mock<IConfiguration>();
67  Assert.ThrowsException<ArgumentNullException>(() => new Application(mockConfiguration.Object, null));
68 
69  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
70 
71  var app = new Application(mockConfiguration.Object, mockHostingEnvironment.Object);
72 
73  var mockOptions = new Mock<IOptions<GeneralConfiguration>>();
74  mockOptions.SetupGet(x => x.Value).Returns(new GeneralConfiguration
75  {
77  }).Verifiable();
78 
79  var fakeServiceDescriptor = new List<ServiceDescriptor>()
80  {
81  new ServiceDescriptor(typeof(IApplicationLifetime), typeof(MockApplicationLifetime), ServiceLifetime.Singleton),
82  new ServiceDescriptor(typeof(ISetupWizard), typeof(MockSetupWizard), ServiceLifetime.Singleton),
83  new ServiceDescriptor(typeof(IOptions<GeneralConfiguration>), mockOptions.Object)
84  };
85 
86  var mockServiceCollection = new Mock<IServiceCollection>();
87 
88  var mockConfigSection = new Mock<IConfigurationSection>();
89 
90  mockConfiguration.Setup(x => x.GetSection(It.IsNotNull<string>())).Returns(mockConfigSection.Object).Verifiable();
91  mockServiceCollection.Setup(x => x.GetEnumerator()).Returns(() => fakeServiceDescriptor.GetEnumerator()).Verifiable();
92 
93  Assert.ThrowsException<OperationCanceledException>(() => app.ConfigureServices(mockServiceCollection.Object));
94 
95  mockOptions.VerifyAll();
96  mockConfiguration.VerifyAll();
97  mockServiceCollection.VerifyAll();
98  }
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + +
+
+
+ +
+
+ + + + + + + +
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));
36 
37  var mockAppBuilder = new Mock<IApplicationBuilder>();
38  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, null, null, null));
39 
40  var mockServerControl = new Mock<IServerControl>();
41  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, null, null));
42 
43  var mockTokenFactory = new Mock<ITokenFactory>();
44  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, mockTokenFactory.Object, null));
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_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..0f29956bc8 --- /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,113 @@ + + + + + + +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..3f5e743f97 --- /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,201 @@ + + + + + + +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 52 of file TestApplication.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.StopApplication ()
+
+ +

Definition at line 60 of file TestApplication.cs.

+
60 { }
+
+
+

Member Data Documentation

+ +
+
+ + + + +
CancellationToken Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.ApplicationStarted => default
+
+ +

Definition at line 54 of file TestApplication.cs.

+ +
+
+ +
+
+ + + + +
CancellationToken Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.ApplicationStopped => default
+
+ +

Definition at line 58 of file TestApplication.cs.

+ +
+
+ +
+
+ + + + +
CancellationToken Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.ApplicationStopping => default
+
+ +

Definition at line 56 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..e82e6ebcff --- /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,110 @@ + + + + + + +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..78d1cab2d2 --- /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,159 @@ + + + + + + +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 47 of file TestApplication.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
Task<bool> Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard.CheckRunWizard (CancellationToken cancellationToken)
+
+ +

Run the setup wizard if necessary

+
Parameters
+ + +
cancellationToken
+
+
+
Returns
+ +

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..e0b5cf336d --- /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,111 @@ + + + + + + +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..629f56e365 --- /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,158 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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..afce287295 --- /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,111 @@ + + + + + + +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..468a5fb8e4 --- /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,160 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + +
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..dcb6eae241 --- /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,111 @@ + + + + + + +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..b9166b649e --- /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,160 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+
+ +
+
+ + + + + + + +
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..db6876f77a --- /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,112 @@ + + + + + + +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..8cbd40d8d3 --- /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,175 @@ + + + + + + +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

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory.TestContruction ()
+
+ +
+
+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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..3cef331946 --- /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,110 @@ + + + + + + +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..28e03a04bb --- /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,140 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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..1f436010b3 --- /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,116 @@ + + + + + + +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..303e46fac1 --- /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,297 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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)
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestJobHandler.TestConstructionAndDisposal ()
+
+ +

Definition at line 21 of file TestJobHandler.cs.

+ +

References Tgstation.Server.Host.Core.JobHandler.Dispose().

+
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)
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestJobHandler.TestJob (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 14 of file TestJobHandler.cs.

+
15  {
16  await currentWaitTask.ConfigureAwait(false);
17  cancelled = cancellationToken.IsCancellationRequested;
18  }
+ +
+
+
+ +
+
+ + + + + + + +
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)
+
+
+
+ +
+
+ + + + + + + +
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)
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.Tests.TestJobHandler.cancelled
+
+private
+
+ +

Definition at line 12 of file TestJobHandler.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Core.Tests.TestJobHandler.currentWaitTask
+
+private
+
+ +

Definition at line 11 of file TestJobHandler.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_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..11a8767c4c --- /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,110 @@ + + + + + + +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..5b159a53fd --- /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,139 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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_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..6c1f8f6365 --- /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,111 @@ + + + + + + +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..d58ca35c8e --- /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,162 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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  //saved, now for second run
148  //this time use defaults amap
149  String.Empty,
150  //test MySQL errors
151  nameof(DatabaseType.MySql),
152  String.Empty,
153  String.Empty,
154  "DbName",
155  "n",
156  "user",
157  "pass",
158  //general config
159  String.Empty,
160  String.Empty,
161  String.Empty,
162  //logging config
163  "y",
164  "not actually verified because lol mocks /../!@#$%^&*()/..///.",
165  "Warning",
166  String.Empty,
167  //third run, we already hit all the code coverage so just get through it
168  String.Empty,
169  nameof(DatabaseType.MariaDB),
170  String.Empty,
171  "dbname",
172  "y",
173  "user",
174  "pass",
175  String.Empty,
176  String.Empty,
177  String.Empty,
178  "y",
179  "will faile",
180  String.Empty,
181  String.Empty,
182  "fake",
183  "None",
184  "Critical"
185  };
186 
187  var inputPos = 0;
188 
189  mockApplication.SetupGet(x => x.VersionPrefix).Returns("sumfuk").Verifiable();
190 
191  mockConsole.Setup(x => x.PressAnyKeyAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
192  mockConsole.Setup(x => x.ReadLineAsync(It.IsAny<bool>(), It.IsAny<CancellationToken>())).Returns(() =>
193  {
194  if (inputPos == finalInputSequence.Count)
195  Assert.Fail("Exhausted input sequence!");
196  var res = finalInputSequence[inputPos++];
197  return Task.FromResult(res);
198  }).Verifiable();
199  mockConsole.Setup(x => x.WriteAsync(It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
200 
201  Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false));
202  //first real run
203  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
204 
205  //second run
206  mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(Encoding.UTF8.GetBytes(String.Empty))).Verifiable();
207  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
208 
209  //third run
210  testGeneralConfig.SetupWizardMode = SetupWizardMode.Autodetect;
211  mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull<string>(), It.IsNotNull<byte[]>(), It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
212  var firstRun = true;
213  mockIOManager.Setup(x => x.CreateDirectory(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(() =>
214  {
215  if (firstRun)
216  {
217  firstRun = false;
218  throw new Exception();
219  }
220  return Task.CompletedTask;
221  }).Verifiable();
222 
223  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
224 
225  Assert.AreEqual(finalInputSequence.Count, inputPos);
226  mockFailCommand.VerifyAll();
227  mockSuccessCommand.VerifyAll();
228  mockIOManager.VerifyAll();
229  mockGeneralConfigurationOptions.VerifyAll();
230  mockConsole.VerifyAll();
231  mockGoodDbConnection.VerifyAll();
232  mockBadDbConnection.VerifyAll();
233  mockUglyDbConnection.VerifyAll();
234  mockDBConnectionFactory.VerifyAll();
235  mockApplication.VerifyAll();
236  mockPlatformIdentifier.VerifyAll();
237  mockAsyncDelayer.VerifyAll();
238  }
+
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..d8c8e6d3ae --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console-members.html @@ -0,0 +1,114 @@ + + + + + + +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..f6a25a5080 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html @@ -0,0 +1,289 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + +
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  }
+
+
+
+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.IO.Console.PressAnyKeyAsync (CancellationToken cancellationToken)
+
+ +

Wait for a key press on the IConsole

+ +

Implements Tgstation.Server.Host.IO.IConsole.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.IO.Console.ReadLineAsync (bool usePasswordChar,
CancellationToken cancellationToken 
)
+
+ +

Read a line from the IConsole

+ +

Implements Tgstation.Server.Host.IO.IConsole.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + +
bool Tgstation.Server.Host.IO.Console.Available => Environment.UserInteractive
+
+ +

+ +

Definition at line 12 of file Console.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_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..07de1517e7 --- /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,137 @@ + + + + + + +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.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AppendAllText(string path, string additional_contents, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
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
CreateSymlink(string target, string link, 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..dde5fbad7e --- /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,1142 @@ + + + + + + +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...
 
async Task AppendAllText (string path, string additional_contents, CancellationToken cancellationToken)
 
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 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...
 
Task CreateSymlink (string target, string link, CancellationToken cancellationToken)
 
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 17 of file DefaultIOManager.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.IO.DefaultIOManager.AppendAllText (string path,
string additional_contents,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 119 of file DefaultIOManager.cs.

+
120  {
121  if (additional_contents == null)
122  throw new ArgumentNullException(nameof(additional_contents));
123  using (var destStream = new FileStream(ResolvePath(path), FileMode.Append, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete, DefaultBufferSize, true))
124  {
125  var buf = Encoding.UTF8.GetBytes(additional_contents);
126  await destStream.WriteAsync(buf, 0, buf.Length, cancellationToken).ConfigureAwait(false);
127  }
128  }
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
+
+
+
+ +
+
+ + + + + + + + +
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 131 of file DefaultIOManager.cs.

+
132  {
133  if (paths == null)
134  throw new ArgumentNullException(nameof(paths));
135  return Path.Combine(paths);
136  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 105 of file DefaultIOManager.cs.

+
106  {
107  if (dest == null)
108  throw new ArgumentNullException(nameof(src));
109  if (dest == null)
110  throw new ArgumentNullException(nameof(src));
111 
112  src = ResolvePath(src);
113  dest = ResolvePath(dest);
114  foreach (var directoryCopy in CopyDirectoryImpl(src, dest, ignore, cancellationToken))
115  await directoryCopy.ConfigureAwait(false);
116  }
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...
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 69 of file DefaultIOManager.cs.

+
70  {
71  var dir = new DirectoryInfo(src);
72  var atLeastOneSubDir = false;
73  foreach (var I in dir.EnumerateDirectories())
74  {
75  if (ignore != null && ignore.Contains(I.Name))
76  continue;
77  foreach (var J in CopyDirectoryImpl(I.FullName, Path.Combine(dest, I.Name), null, cancellationToken))
78  {
79  atLeastOneSubDir = true;
80  yield return J;
81  }
82  }
83 
84  async Task CopyThisDirectory()
85  {
86  if (!atLeastOneSubDir)
87  await CreateDirectory(dest, cancellationToken).ConfigureAwait(false); //save on createdir calls
88 
89  var tasks = new List<Task>();
90 
91  await dir.EnumerateFiles().ToAsyncEnumerable().ForEachAsync(I =>
92  {
93  if (ignore != null && ignore.Contains(I.Name))
94  return;
95  tasks.Add(CopyFile(I.FullName, Path.Combine(dest, I.Name), cancellationToken));
96  }).ConfigureAwait(false);
97 
98  await Task.WhenAll(tasks).ConfigureAwait(false);
99  };
100 
101  yield return CopyThisDirectory();
102  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 139 of file DefaultIOManager.cs.

+
140  {
141  if (src == null)
142  throw new ArgumentNullException(nameof(src));
143  if (dest == null)
144  throw new ArgumentNullException(nameof(dest));
145  using (var srcStream = new FileStream(ResolvePath(src), FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
146  using (var destStream = new FileStream(ResolvePath(dest), FileMode.Create, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete, DefaultBufferSize, true))
147  await srcStream.CopyToAsync(destStream, 81920, cancellationToken).ConfigureAwait(false);
148  }
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.CreateDirectory (string path,
CancellationToken cancellationToken 
)
+
+ +

Create a directory at path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.CreateSymlink (string target,
string link,
CancellationToken cancellationToken 
)
+
+ +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 154 of file DefaultIOManager.cs.

+
155  {
156  path = ResolvePath(path);
157  var di = new DirectoryInfo(path);
158  if (!di.Exists)
159  return;
160  await NormalizeAndDelete(di, cancellationToken).ConfigureAwait(false);
161  }
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...
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.DeleteFile (string path,
CancellationToken cancellationToken 
)
+
+ +

Deletes a file at path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 277 of file DefaultIOManager.cs.

+
278  {
279  //DownloadDataTaskAsync can't be cancelled and is shittily written, don't use it
280  using (var wc = new WebClient())
281  {
282  var tcs = new TaskCompletionSource<byte[]>();
283  wc.DownloadDataCompleted += (a, b) =>
284  {
285  if (b.Error != null)
286  tcs.TrySetException(b.Error);
287  else if (b.Cancelled)
288  tcs.TrySetCanceled();
289  else
290  tcs.TrySetResult(b.Result);
291  };
292  wc.DownloadDataAsync(url);
293  using (cancellationToken.Register(() =>
294  {
295  wc.CancelAsync();
296  tcs.TrySetCanceled();
297  }))
298  return await tcs.Task.ConfigureAwait(false);
299  }
300  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.DefaultIOManager.GetDirectoryName (string path)
+
+ +

Gets the directory portion of a given path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.DefaultIOManager.GetFileName (string path)
+
+ +

Gets the file name portion of a path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.DefaultIOManager.GetFileNameWithoutExtension (string path)
+
+ +

Gets the file name portion of a path with

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 30 of file DefaultIOManager.cs.

+
31  {
32  var tasks = new List<Task>();
33 
34  foreach (var subDir in dir.EnumerateDirectories())
35  {
36  cancellationToken.ThrowIfCancellationRequested();
37  if (!subDir.Attributes.HasFlag(FileAttributes.Directory) || subDir.Attributes.HasFlag(FileAttributes.ReparsePoint))
38  //this is probably a symlink
39  subDir.Delete();
40  else
41  tasks.Add(NormalizeAndDelete(subDir, cancellationToken));
42  }
43  foreach (var file in dir.EnumerateFiles())
44  {
45  cancellationToken.ThrowIfCancellationRequested();
46  file.Attributes = FileAttributes.Normal;
47  file.Delete();
48  }
49  await Task.WhenAll(tasks).ConfigureAwait(false);
50  cancellationToken.ThrowIfCancellationRequested();
51  dir.Delete(true);
52  }
static async Task NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)
Recursively empty a directory
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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
+ +
+
+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.DefaultIOManager.PathContainsParentAccess (string path)
+
+ +

Check if a path contains the '..' parent directory accessor

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 217 of file DefaultIOManager.cs.

+
218  {
219  path = ResolvePath(path);
220  using (var file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
221  {
222  byte[] buf;
223  buf = new byte[file.Length];
224  await file.ReadAsync(buf, 0, (int)file.Length, cancellationToken).ConfigureAwait(false);
225  return buf;
226  }
227  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 call this internally on given paths

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Reimplemented in Tgstation.Server.Host.IO.ResolvingIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 233 of file DefaultIOManager.cs.

+
234  {
235  path = ResolvePath(path);
236  using (var file = OpenWriteStream(path))
237  await file.WriteAsync(contents, 0, contents.Length, cancellationToken).ConfigureAwait(false);
238  }
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...
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + +
const int Tgstation.Server.Host.IO.DefaultIOManager.DefaultBufferSize = 4096
+
+ +

Default FileStream buffer size used by .NET

+ +

Definition at line 22 of file DefaultIOManager.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_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..3357aec8cb --- /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,158 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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..e6f1fdc229 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html @@ -0,0 +1,172 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AppendAllText(string path, string additional_contents, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
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
CreateSymlink(string target, string link, 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..4a33a7ac4c --- /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,321 @@ + + + + + + +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 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...
 
async Task AppendAllText (string path, string additional_contents, CancellationToken cancellationToken)
 
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...
 
Task CreateSymlink (string target, string link, CancellationToken cancellationToken)
 
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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.IO.IIOManager.ResolvePath().

+
22  {
23  if (parent == null)
24  throw new ArgumentNullException(nameof(parent));
25  if (_subdirectory == null)
26  throw new ArgumentNullException(nameof(_subdirectory));
27 
28  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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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 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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..f2034cff59 --- /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,116 @@ + + + + + + +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..b743a90070 --- /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,360 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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  if (originalBytes.Length != 0 && sha1InOut == null)
99  //no sha1? no write
100  return false;
101 
102  //suppressed due to only using for consistency checks
103 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
104  using (var sha1 = new SHA1Managed())
105 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
106  {
107  string GetSha1(byte[] dataToHash) => dataToHash != null && dataToHash.Length != 0 ? String.Join("", sha1.ComputeHash(dataToHash).Select(b => b.ToString("x2", CultureInfo.InvariantCulture))) : null;
108  var originalSha1 = GetSha1(originalBytes);
109  if (originalSha1 != sha1InOut)
110  {
111  sha1InOut = originalSha1;
112  return false;
113  }
114  sha1InOut = GetSha1(data);
115  }
116  cancellationToken.ThrowIfCancellationRequested();
117 
118  if (data != null)
119  {
120  file.Seek(0, SeekOrigin.Begin);
121 
122  cancellationToken.ThrowIfCancellationRequested();
123  file.SetLength(data.Length);
124  file.Write(data, 0, data.Length);
125  }
126  }
127  if (data == null)
128  File.Delete(path);
129  return true;
130  }
+
+
+
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..b71f5c10d4 --- /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,158 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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..bcf5e504fb --- /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,112 @@ + + + + + + +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..dea270e816 --- /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,181 @@ + + + + + + +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

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.IO.Tests.TestPostWriteHandler.TestPostWrite ()
+
+ +

Definition at line 28 of file TestPostWriteHandler.cs.

+ +

References Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite().

+
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  }
+
+
+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.IO.Tests.TestPostWriteHandler.TestThrowsWithNullArg ()
+
+ +

Definition at line 15 of file TestPostWriteHandler.cs.

+ +

References Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite().

+
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  }
+
+
+
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..f39a01fb0c --- /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,115 @@ + + + + + + +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..258b1dd22b --- /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,271 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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  }
+
+
+
+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestDirectoryWorks ()
+
+ +

Definition at line 63 of file TestSymlinkFactory.cs.

+ +

References Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink().

+
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  }
+ + +
+
+
+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestFailsProperly ()
+
+ +

Definition at line 101 of file TestSymlinkFactory.cs.

+ +

References Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink().

+
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  }
+ +
+
+
+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestFileWorks ()
+
+ +

Definition at line 34 of file TestSymlinkFactory.cs.

+ +

References Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink().

+
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  }
+ + +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
ISymlinkFactory Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.symlinkFactory
+
+private
+
+ +

Definition at line 13 of file TestSymlinkFactory.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_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..c1a208c9b3 --- /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,110 @@ + + + + + + +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..c89b4d7014 --- /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,158 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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..bf4561e367 --- /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,110 @@ + + + + + + +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..503193cc8f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html @@ -0,0 +1,172 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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..b43cdb25e9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot-members.html @@ -0,0 +1,119 @@ + + + + + + +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..cdf2e828c9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html @@ -0,0 +1,258 @@ + + + + + + +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...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+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...
 
ChatProvider Provider [get, set]
 The ChatProvider used for the connection More...
 
string ConnectionString [get, set]
 The information used to connect to the Provider More...
 
ChatConnectionStringBuilder ConnectionStringBuilder [get, set]
 The ChatConnectionStringBuilder which maps to the ConnectionString More...
 
+

Detailed Description

+
+

Definition at line 8 of file ChatBot.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
List<ChatChannel> Tgstation.Server.Host.Models.ChatBot.Channels
+
+getset
+
+ +

See Api.Models.ChatBot.Channels

+ +

Definition at line 24 of file ChatBot.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.ChatBot.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 19 of file ChatBot.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ChatBot.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 13 of file ChatBot.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_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..35e3fd7daf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel-members.html @@ -0,0 +1,119 @@ + + + + + + +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..6bcb7e7a6d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html @@ -0,0 +1,258 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
ChatBot Tgstation.Server.Host.Models.ChatChannel.ChatSettings
+
+getset
+
+ +

The Models.ChatBot

+ +

Definition at line 21 of file ChatChannel.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ChatChannel.ChatSettingsId
+
+getset
+
+ +

The Api.Models.Internal.ChatBot.Id

+ +

Definition at line 16 of file ChatChannel.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ChatChannel.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file ChatChannel.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_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..ef207f21b7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job-members.html @@ -0,0 +1,119 @@ + + + + + + +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..d0f2d55f02 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html @@ -0,0 +1,286 @@ + + + + + + +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...
 
DreamDaemonSecurity MinimumSecurityLevel [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

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Host.Models.CompileJob.Job
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.CompileJob.JobId
+
+getset
+
+ +

The Api.Models.Internal.Job.Id of Job

+ +

Definition at line 18 of file CompileJob.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Models.CompileJob.RevisionInformation
+
+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_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 >
TestMergesTgstation.Server.Host.Models.DatabaseContext< TParentContext >
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..a1af99b168 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html @@ -0,0 +1,838 @@ + + + + + + +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 Reference
+
+
+ +

+ 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...
 
+ + + +

+Protected Member Functions

override void OnModelCreating (ModelBuilder modelBuilder)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+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 13 of file DatabaseContext.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 86 of file DatabaseContext.cs.

+
86  : base(dbContextOptions)
87  {
88  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
89  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
90  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
91  }
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

+ +
+
+ + + + + + + + +
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 137 of file DatabaseContext.cs.

+
138  {
140  {
141  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
142  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
143  }
144 
145  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
146  var wasEmpty = !migrations.Any();
147 
148  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
149  {
150  Logger.LogInformation("Migrating database...");
151  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
152  }
153  else
154  Logger.LogDebug("No migrations to apply.");
155 
156  wasEmpty |= (await Users.CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
157 
158  if (wasEmpty)
159  {
160  Logger.LogInformation("Seeding database...");
161  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
162  }
164  {
165  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
166  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
167  }
168  }
+
Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it&#39;s default and enables the account ...
+
bool ResetAdminPassword
If the admin user should be enabled and have it&#39;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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.OnModelCreating (ModelBuilder modelBuilder)
+
+protected
+
+ +

+ +

Definition at line 94 of file DatabaseContext.cs.

+
95  {
96  Logger.LogTrace("Building entity framework context...");
97  base.OnModelCreating(modelBuilder);
98 
99  var userModel = modelBuilder.Entity<User>();
100  userModel.HasIndex(x => x.CanonicalName).IsUnique();
101  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
102 
103  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
104 
105  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.Cascade);
106 
107  var revInfo = modelBuilder.Entity<RevisionInformation>();
108  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
109  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
110  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Restrict);
111  revInfo.HasIndex(x => x.CommitSha).IsUnique();
112 
113  modelBuilder.Entity<CompileJob>().HasIndex(x => x.DirectoryName);
114 
115  modelBuilder.Entity<Job>().HasOne<CompileJob>().WithOne(x => x.Job).OnDelete(DeleteBehavior.Restrict);
116 
117  var chatChannel = modelBuilder.Entity<ChatChannel>();
118  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
119  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
120  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
121 
122  modelBuilder.Entity<ChatBot>().HasIndex(x => x.Name).IsUnique();
123 
124  var instanceModel = modelBuilder.Entity<Instance>();
125  instanceModel.HasIndex(x => x.Path).IsUnique();
126  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
127  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
128  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
129  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
130  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
131  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
132  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
133  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
134  }
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+
+
+
+ + +

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseSeeder Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.databaseSeeder
+
+private
+
+ +

The IDatabaseSeeder for the DatabaseContext<TParentContext>

+ +

Definition at line 77 of file DatabaseContext.cs.

+ +
+
+

Property Documentation

+ + + +
+
+ + + + + +
+ + + + +
DbSet<ChatChannel> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatChannels
+
+getset
+
+ +

+ +

Definition at line 43 of file DatabaseContext.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.ChatController.Update().

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<CompileJob> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.CompileJobs
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
DatabaseConfiguration Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DatabaseConfiguration
+
+getprotected
+
+ +

The DatabaseConfiguration for the DatabaseContext<TParentContext>

+ +

Definition at line 72 of file DatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<DreamDaemonSettings> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DreamDaemonSettings
+
+getset
+
+ +

+ +

Definition at line 34 of file DatabaseContext.cs.

+ +
+
+ + + + + +
+
+ + + + + +
+ + + + +
DbSet<InstanceUser> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.InstanceUsers
+
+getset
+
+ +

+ +

Definition at line 40 of file DatabaseContext.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceUserController.Create().

+ +
+
+ + + +
+
+ + + + + +
+ + + + +
ILogger Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Logger
+
+getprotected
+
+ +

The ILogger for the DatabaseContext<TParentContext>

+ +

Definition at line 67 of file DatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<ReattachInformation> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ReattachInformations
+
+getset
+
+ +

+ +

Definition at line 49 of file DatabaseContext.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceController.Delete().

+ +
+
+ + + +
+
+ + + + + +
+ + + + +
DbSet<RevInfoTestMerge> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RevInfoTestMerges
+
+getset
+
+ +

The RevInfoTestMerges om the DatabaseContext<TParentContext>

+ +

Definition at line 62 of file DatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<RevisionInformation> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RevisionInformations
+
+getset
+
+ +

+ +

Definition at line 25 of file DatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<TestMerge> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.TestMerges
+
+getset
+
+ +

The TestMerges in the DatabaseContext<TParentContext>

+ +

Definition at line 57 of file DatabaseContext.cs.

+ +
+
+ + + +
+
+ + + + + +
+ + + + +
DbSet<WatchdogReattachInformation> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.WatchdogReattachInformations
+
+getset
+
+ +

+ +

Definition at line 52 of file DatabaseContext.cs.

+ +

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..3943710713 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder-members.html @@ -0,0 +1,114 @@ + + + + + + +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..b94a1fe1df --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html @@ -0,0 +1,317 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Models.DatabaseSeeder.DatabaseSeeder (ICryptographySuite cryptographySuite)
+
+ +

Construct a DatabaseSeeder

+
Parameters
+ + +
cryptographySuiteThe value of cryptographySuite
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.IDatabaseContext.Save(), and Tgstation.Server.Host.Models.IDatabaseContext.Users.

+
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.IDatabaseContext.Users.

+
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.IDatabaseContext.Save().

+
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Models.DatabaseSeeder.cryptographySuite
+
+private
+
+ +

The ICryptographySuite for the DatabaseContext<TParentContext>

+ +

Definition at line 17 of file DatabaseSeeder.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_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..d5c9108a64 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings-members.html @@ -0,0 +1,123 @@ + + + + + + +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..6aeaf6a7ad --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html @@ -0,0 +1,301 @@ + + + + + + +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...
 
DreamDaemonSecurity SecurityLevel [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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.DreamDaemonSettings.AccessToken
+
+getset
+
+ +

The access token used for communication with DD

+ +

Definition at line 21 of file DreamDaemonSettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamDaemonSettings.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file DreamDaemonSettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.DreamDaemonSettings.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 32 of file DreamDaemonSettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamDaemonSettings.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 26 of file DreamDaemonSettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Models.DreamDaemonSettings.ProcessId
+
+getset
+
+ +

The PID of a currently running DD instance

+ +

Definition at line 16 of file DreamDaemonSettings.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_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..d11c890e84 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html @@ -0,0 +1,249 @@ + + + + + + +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...
 
DreamDaemonSecurity ApiValidationSecurityLevel [get, set]
 The DreamDaemonSecurity level used to validate the DMAPI More...
 
+

Detailed Description

+
+

Definition at line 6 of file DreamMakerSettings.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamMakerSettings.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file DreamMakerSettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.DreamMakerSettings.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 22 of file DreamMakerSettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamMakerSettings.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 16 of file DreamMakerSettings.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_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..2cad31cf2e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance-members.html @@ -0,0 +1,126 @@ + + + + + + +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..dd09db828b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html @@ -0,0 +1,400 @@ + + + + + + +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 ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+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 Models.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...
 
ConfigurationType ConfigurationType [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

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
List<ChatBot> Tgstation.Server.Host.Models.Instance.ChatSettings
+
+getset
+
+ +

The Models.ChatBots for the Instance

+ +

Definition at line 39 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonSettings Tgstation.Server.Host.Models.Instance.DreamDaemonSettings
+
+getset
+
+ +

The Models.DreamDaemonSettings for the Instance

+ +

Definition at line 19 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamMakerSettings Tgstation.Server.Host.Models.Instance.DreamMakerSettings
+
+getset
+
+ +

The Models.DreamMakerSettings for the Instance

+ +

Definition at line 14 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<InstanceUser> Tgstation.Server.Host.Models.Instance.InstanceUsers
+
+getset
+
+ +

The InstanceUsers in the Instance

+ +

Definition at line 34 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<Job> Tgstation.Server.Host.Models.Instance.Jobs
+
+getset
+
+ +

The Jobs in the Instance

+ +

Definition at line 49 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
RepositorySettings Tgstation.Server.Host.Models.Instance.RepositorySettings
+
+getset
+
+ +

The Models.RepositorySettings for the Instance

+ +

Definition at line 24 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<RevisionInformation> Tgstation.Server.Host.Models.Instance.RevisionInformations
+
+getset
+
+ +

The RevisionInformations in the Instance

+ +

Definition at line 44 of file Instance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
WatchdogReattachInformation Tgstation.Server.Host.Models.Instance.WatchdogReattachInformation
+
+getset
+
+ +

The Models.WatchdogReattachInformation for the Instance

+ +

Definition at line 29 of file Instance.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_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..3b869798bf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user-members.html @@ -0,0 +1,122 @@ + + + + + + +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..fcfc6f0eb1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html @@ -0,0 +1,288 @@ + + + + + + +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...
 
InstanceUserRights InstanceUserRights [get, set]
 The Rights.InstanceUserRights of the InstanceUser More...
 
ByondRights ByondRights [get, set]
 The Rights.ByondRights of the InstanceUser More...
 
DreamDaemonRights DreamDaemonRights [get, set]
 The Rights.DreamDaemonRights of the InstanceUser More...
 
DreamMakerRights DreamMakerRights [get, set]
 The Rights.DreamMakerRights of the InstanceUser More...
 
RepositoryRights RepositoryRights [get, set]
 The Rights.RepositoryRights of the InstanceUser More...
 
ChatBotRights ChatBotRights [get, set]
 The Rights.ChatBotRights of the InstanceUser More...
 
ConfigurationRights ConfigurationRights [get, set]
 The Rights.ConfigurationRights of the InstanceUser More...
 
+

Detailed Description

+
+

Definition at line 6 of file InstanceUser.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + +
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

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.InstanceUser.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.InstanceUser.Instance
+
+getset
+
+ +

The Models.Instance the InstanceUser belongs to

+ +

Definition at line 22 of file InstanceUser.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.InstanceUser.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id of Instance

+ +

Definition at line 16 of file InstanceUser.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_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..bd45ed72ef --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job-members.html @@ -0,0 +1,122 @@ + + + + + + +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..46faa609bb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html @@ -0,0 +1,300 @@ + + + + + + +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...
 
RightsType CancelRightsType [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

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.Job.CancelledBy
+
+getset
+
+ +

See Api.Models.Job.CancelledBy

+ +

Definition at line 21 of file Job.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.CancelJob().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.Job.StartedBy
+
+getset
+
+ +

See Api.Models.Job.StartedBy

+ +

Definition at line 16 of file Job.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+
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..69d8f72f88 --- /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,112 @@ + + + + + + +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..f109e7d31b --- /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,218 @@ + + + + + + +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 Models.DatabaseContext<TParentContext>s + More...

+ + + + +

+Static Public Member Functions

static IOptions< DatabaseConfigurationGetDbContextOptions ()
 
+ + + + + + + +

+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 Models.DatabaseContext<TParentContext>s

+ +

Definition at line 12 of file DesignTimeDbContextFactoryHelpers.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
static IOptions<DatabaseConfiguration> Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.GetDbContextOptions ()
+
+static
+
+ +

+ +

Definition at line 24 of file DesignTimeDbContextFactoryHelpers.cs.

+ +

References Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section.

+
25  {
26  var builder = new ConfigurationBuilder();
27  builder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
28  builder.AddJsonFile(RootJson);
29  builder.AddJsonFile(DevJson);
30  var configuration = builder.Build();
31  return Options.Create(configuration.GetSection(DatabaseConfiguration.Section).Get<DatabaseConfiguration>());
32  }
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
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 21 of file DesignTimeDbContextFactoryHelpers.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..c13050d574 --- /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,112 @@ + + + + + + +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..c351fb377d --- /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,246 @@ + + + + + + +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 9 of file 20180918021228_MSAddMinimumSecurity.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 34 of file 20180918021228_MSAddMinimumSecurity.cs.

+
35  {
36  migrationBuilder.DropColumn(
37  name: "ApiValidationSecurityLevel",
38  table: "DreamMakerSettings");
39 
40  migrationBuilder.DropColumn(
41  name: "MinimumSecurityLevel",
42  table: "CompileJobs");
43  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20180918021228_MSAddMinimumSecurity.cs.

+
16  {
17  migrationBuilder.AddColumn<int>(
18  name: "ApiValidationSecurityLevel",
19  table: "DreamMakerSettings",
20  nullable: false,
21  defaultValue: (int)DreamDaemonSecurity.Safe);
22 
23  migrationBuilder.AddColumn<int>(
24  name: "MinimumSecurityLevel",
25  table: "CompileJobs",
26  nullable: false,
27  defaultValue: (int)DreamDaemonSecurity.Safe);
28  }
DreamDaemonSecurity
DreamDaemon&#39;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_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..3e421874d1 --- /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,112 @@ + + + + + + +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..727eb5d697 --- /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,258 @@ + + + + + + +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 10 of file 20180906135553_MSInitialCreate.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 596 of file 20180906135553_MSInitialCreate.cs.

+
597  {
598  migrationBuilder.DropForeignKey(
599  name: "FK_Jobs_Instances_InstanceId",
600  table: "Jobs");
601 
602  migrationBuilder.DropForeignKey(
603  name: "FK_RevisionInformations_Instances_InstanceId",
604  table: "RevisionInformations");
605 
606  migrationBuilder.DropTable(
607  name: "ChatChannels");
608 
609  migrationBuilder.DropTable(
610  name: "DreamDaemonSettings");
611 
612  migrationBuilder.DropTable(
613  name: "DreamMakerSettings");
614 
615  migrationBuilder.DropTable(
616  name: "InstanceUsers");
617 
618  migrationBuilder.DropTable(
619  name: "RepositorySettings");
620 
621  migrationBuilder.DropTable(
622  name: "RevInfoTestMerges");
623 
624  migrationBuilder.DropTable(
625  name: "ChatBots");
626 
627  migrationBuilder.DropTable(
628  name: "TestMerges");
629 
630  migrationBuilder.DropTable(
631  name: "Instances");
632 
633  migrationBuilder.DropTable(
634  name: "WatchdogReattachInformations");
635 
636  migrationBuilder.DropTable(
637  name: "ReattachInformations");
638 
639  migrationBuilder.DropTable(
640  name: "CompileJobs");
641 
642  migrationBuilder.DropTable(
643  name: "Jobs");
644 
645  migrationBuilder.DropTable(
646  name: "RevisionInformations");
647 
648  migrationBuilder.DropTable(
649  name: "Users");
650  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 16 of file 20180906135553_MSInitialCreate.cs.

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

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 121 of file 20180918205224_MSNullableAndForeignKeyCleanup.cs.

+
122  {
123  migrationBuilder.DropForeignKey(
124  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
125  table: "TestMerges");
126 
127  migrationBuilder.DropForeignKey(
128  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
129  table: "WatchdogReattachInformations");
130 
131  migrationBuilder.DropIndex(
132  name: "IX_WatchdogReattachInformations_InstanceId",
133  table: "WatchdogReattachInformations");
134 
135  migrationBuilder.DropIndex(
136  name: "IX_TestMerges_PrimaryRevisionInformationId",
137  table: "TestMerges");
138 
139  migrationBuilder.DropIndex(
140  name: "IX_CompileJobs_JobId",
141  table: "CompileJobs");
142 
143  migrationBuilder.DropColumn(
144  name: "InstanceId",
145  table: "WatchdogReattachInformations");
146 
147  migrationBuilder.AlterColumn<long>(
148  name: "PrimaryRevisionInformationId",
149  table: "TestMerges",
150  nullable: true,
151  oldClrType: typeof(long));
152 
153  migrationBuilder.AddColumn<long>(
154  name: "WatchdogReattachInformationId",
155  table: "Instances",
156  nullable: true);
157 
158  migrationBuilder.AlterColumn<string>(
159  name: "Output",
160  table: "CompileJobs",
161  nullable: true,
162  oldClrType: typeof(string));
163 
164  migrationBuilder.AlterColumn<long>(
165  name: "JobId",
166  table: "CompileJobs",
167  nullable: true,
168  oldClrType: typeof(long));
169 
170  migrationBuilder.AlterColumn<string>(
171  name: "DmeName",
172  table: "CompileJobs",
173  nullable: true,
174  oldClrType: typeof(string));
175 
176  migrationBuilder.AlterColumn<Guid>(
177  name: "DirectoryName",
178  table: "CompileJobs",
179  nullable: true,
180  oldClrType: typeof(Guid));
181 
182  migrationBuilder.CreateIndex(
183  name: "IX_TestMerges_PrimaryRevisionInformationId",
184  table: "TestMerges",
185  column: "PrimaryRevisionInformationId",
186  unique: true,
187  filter: "[PrimaryRevisionInformationId] IS NOT NULL");
188 
189  migrationBuilder.CreateIndex(
190  name: "IX_Instances_WatchdogReattachInformationId",
191  table: "Instances",
192  column: "WatchdogReattachInformationId");
193 
194  migrationBuilder.CreateIndex(
195  name: "IX_CompileJobs_JobId",
196  table: "CompileJobs",
197  column: "JobId");
198 
199  migrationBuilder.AddForeignKey(
200  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
201  table: "Instances",
202  column: "WatchdogReattachInformationId",
203  principalTable: "WatchdogReattachInformations",
204  principalColumn: "Id",
205  onDelete: ReferentialAction.Restrict);
206 
207  migrationBuilder.AddForeignKey(
208  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
209  table: "TestMerges",
210  column: "PrimaryRevisionInformationId",
211  principalTable: "RevisionInformations",
212  principalColumn: "Id",
213  onDelete: ReferentialAction.SetNull);
214  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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  migrationBuilder.DropForeignKey(
18  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
19  table: "Instances");
20 
21  migrationBuilder.DropForeignKey(
22  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
23  table: "TestMerges");
24 
25  migrationBuilder.DropIndex(
26  name: "IX_TestMerges_PrimaryRevisionInformationId",
27  table: "TestMerges");
28 
29  migrationBuilder.DropIndex(
30  name: "IX_Instances_WatchdogReattachInformationId",
31  table: "Instances");
32 
33  migrationBuilder.DropIndex(
34  name: "IX_CompileJobs_JobId",
35  table: "CompileJobs");
36 
37  migrationBuilder.DropColumn(
38  name: "WatchdogReattachInformationId",
39  table: "Instances");
40 
41  migrationBuilder.AddColumn<long>(
42  name: "InstanceId",
43  table: "WatchdogReattachInformations",
44  nullable: false,
45  defaultValue: 0L);
46 
47  migrationBuilder.AlterColumn<long>(
48  name: "PrimaryRevisionInformationId",
49  table: "TestMerges",
50  nullable: false,
51  oldClrType: typeof(long),
52  oldNullable: true);
53 
54  migrationBuilder.AlterColumn<string>(
55  name: "Output",
56  table: "CompileJobs",
57  nullable: false,
58  oldClrType: typeof(string),
59  oldNullable: true);
60 
61  migrationBuilder.AlterColumn<long>(
62  name: "JobId",
63  table: "CompileJobs",
64  nullable: false,
65  oldClrType: typeof(long),
66  oldNullable: true);
67 
68  migrationBuilder.AlterColumn<string>(
69  name: "DmeName",
70  table: "CompileJobs",
71  nullable: false,
72  oldClrType: typeof(string),
73  oldNullable: true);
74 
75  migrationBuilder.AlterColumn<Guid>(
76  name: "DirectoryName",
77  table: "CompileJobs",
78  nullable: false,
79  oldClrType: typeof(Guid),
80  oldNullable: true);
81 
82  migrationBuilder.CreateIndex(
83  name: "IX_WatchdogReattachInformations_InstanceId",
84  table: "WatchdogReattachInformations",
85  column: "InstanceId",
86  unique: true);
87 
88  migrationBuilder.CreateIndex(
89  name: "IX_TestMerges_PrimaryRevisionInformationId",
90  table: "TestMerges",
91  column: "PrimaryRevisionInformationId",
92  unique: true);
93 
94  migrationBuilder.CreateIndex(
95  name: "IX_CompileJobs_JobId",
96  table: "CompileJobs",
97  column: "JobId",
98  unique: true);
99 
100  migrationBuilder.AddForeignKey(
101  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
102  table: "TestMerges",
103  column: "PrimaryRevisionInformationId",
104  principalTable: "RevisionInformations",
105  principalColumn: "Id",
106  onDelete: ReferentialAction.Restrict);
107 
108  migrationBuilder.AddForeignKey(
109  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
110  table: "WatchdogReattachInformations",
111  column: "InstanceId",
112  principalTable: "Instances",
113  principalColumn: "Id",
114  onDelete: ReferentialAction.Cascade);
115  }
+
+
+
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..5d025ccaf1 --- /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,112 @@ + + + + + + +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..5cb095f775 --- /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,245 @@ + + + + + + +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 8 of file 20180926033145_MSReattachCompileJobRequired.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 40 of file 20180926033145_MSReattachCompileJobRequired.cs.

+
41  {
42  migrationBuilder.DropForeignKey(
43  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
44  table: "ReattachInformations");
45 
46  migrationBuilder.AlterColumn<long>(
47  name: "CompileJobId",
48  table: "ReattachInformations",
49  nullable: true,
50  oldClrType: typeof(long));
51 
52  migrationBuilder.AddForeignKey(
53  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
54  table: "ReattachInformations",
55  column: "CompileJobId",
56  principalTable: "CompileJobs",
57  principalColumn: "Id",
58  onDelete: ReferentialAction.Restrict);
59  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 14 of file 20180926033145_MSReattachCompileJobRequired.cs.

+
15  {
16  migrationBuilder.DropForeignKey(
17  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
18  table: "ReattachInformations");
19 
20  migrationBuilder.AlterColumn<long>(
21  name: "CompileJobId",
22  table: "ReattachInformations",
23  nullable: false,
24  oldClrType: typeof(long),
25  oldNullable: true);
26 
27  migrationBuilder.AddForeignKey(
28  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
29  table: "ReattachInformations",
30  column: "CompileJobId",
31  principalTable: "CompileJobs",
32  principalColumn: "Id",
33  onDelete: ReferentialAction.Cascade);
34  }
+
+
+
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.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..39e62abc97 --- /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,246 @@ + + + + + + +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 9 of file 20180918020726_MYAddMinimumSecurity.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 34 of file 20180918020726_MYAddMinimumSecurity.cs.

+
35  {
36  migrationBuilder.DropColumn(
37  name: "ApiValidationSecurityLevel",
38  table: "DreamMakerSettings");
39 
40  migrationBuilder.DropColumn(
41  name: "MinimumSecurityLevel",
42  table: "CompileJobs");
43  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20180918020726_MYAddMinimumSecurity.cs.

+
16  {
17  migrationBuilder.AddColumn<int>(
18  name: "ApiValidationSecurityLevel",
19  table: "DreamMakerSettings",
20  nullable: false,
21  defaultValue: (int)DreamDaemonSecurity.Safe);
22 
23  migrationBuilder.AddColumn<int>(
24  name: "MinimumSecurityLevel",
25  table: "CompileJobs",
26  nullable: false,
27  defaultValue: (int)DreamDaemonSecurity.Safe);
28  }
DreamDaemonSecurity
DreamDaemon&#39;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_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..8e10a6f710 --- /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,112 @@ + + + + + + +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..f3bbfc69d1 --- /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,258 @@ + + + + + + +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 10 of file 20180906143029_MYInitialCreate.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 593 of file 20180906143029_MYInitialCreate.cs.

+
594  {
595  migrationBuilder.DropForeignKey(
596  name: "FK_Jobs_Instances_InstanceId",
597  table: "Jobs");
598 
599  migrationBuilder.DropForeignKey(
600  name: "FK_RevisionInformations_Instances_InstanceId",
601  table: "RevisionInformations");
602 
603  migrationBuilder.DropTable(
604  name: "ChatChannels");
605 
606  migrationBuilder.DropTable(
607  name: "DreamDaemonSettings");
608 
609  migrationBuilder.DropTable(
610  name: "DreamMakerSettings");
611 
612  migrationBuilder.DropTable(
613  name: "InstanceUsers");
614 
615  migrationBuilder.DropTable(
616  name: "RepositorySettings");
617 
618  migrationBuilder.DropTable(
619  name: "RevInfoTestMerges");
620 
621  migrationBuilder.DropTable(
622  name: "ChatBots");
623 
624  migrationBuilder.DropTable(
625  name: "TestMerges");
626 
627  migrationBuilder.DropTable(
628  name: "Instances");
629 
630  migrationBuilder.DropTable(
631  name: "WatchdogReattachInformations");
632 
633  migrationBuilder.DropTable(
634  name: "ReattachInformations");
635 
636  migrationBuilder.DropTable(
637  name: "CompileJobs");
638 
639  migrationBuilder.DropTable(
640  name: "Jobs");
641 
642  migrationBuilder.DropTable(
643  name: "RevisionInformations");
644 
645  migrationBuilder.DropTable(
646  name: "Users");
647  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 16 of file 20180906143029_MYInitialCreate.cs.

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

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 123 of file 20180918204520_MYNullableAndForeignKeyCleanup.cs.

+
124  {
125  migrationBuilder.DropForeignKey(
126  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
127  table: "TestMerges");
128 
129  migrationBuilder.DropForeignKey(
130  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
131  table: "WatchdogReattachInformations");
132 
133  migrationBuilder.DropForeignKey(
134  name: "FK_CompileJobs_Jobs_JobId",
135  table: "CompileJobs");
136 
137  migrationBuilder.DropIndex(
138  name: "IX_WatchdogReattachInformations_InstanceId",
139  table: "WatchdogReattachInformations");
140 
141  migrationBuilder.DropIndex(
142  name: "IX_CompileJobs_JobId",
143  table: "CompileJobs");
144 
145  migrationBuilder.DropColumn(
146  name: "InstanceId",
147  table: "WatchdogReattachInformations");
148 
149  migrationBuilder.AlterColumn<long>(
150  name: "PrimaryRevisionInformationId",
151  table: "TestMerges",
152  nullable: true,
153  oldClrType: typeof(long));
154 
155  migrationBuilder.AddColumn<long>(
156  name: "WatchdogReattachInformationId",
157  table: "Instances",
158  nullable: true);
159 
160  migrationBuilder.AlterColumn<string>(
161  name: "Output",
162  table: "CompileJobs",
163  nullable: true,
164  oldClrType: typeof(string));
165 
166  migrationBuilder.AlterColumn<long>(
167  name: "JobId",
168  table: "CompileJobs",
169  nullable: true,
170  oldClrType: typeof(long));
171 
172  migrationBuilder.AlterColumn<string>(
173  name: "DmeName",
174  table: "CompileJobs",
175  nullable: true,
176  oldClrType: typeof(string));
177 
178  migrationBuilder.AlterColumn<Guid>(
179  name: "DirectoryName",
180  table: "CompileJobs",
181  nullable: true,
182  oldClrType: typeof(Guid));
183 
184  migrationBuilder.CreateIndex(
185  name: "IX_Instances_WatchdogReattachInformationId",
186  table: "Instances",
187  column: "WatchdogReattachInformationId");
188 
189  migrationBuilder.CreateIndex(
190  name: "IX_CompileJobs_JobId",
191  table: "CompileJobs",
192  column: "JobId");
193 
194  migrationBuilder.AddForeignKey(
195  name: "FK_CompileJobs_Jobs_JobId",
196  table: "CompileJobs",
197  column: "JobId",
198  principalTable: "Jobs",
199  principalColumn: "Id",
200  onDelete: ReferentialAction.Restrict);
201 
202  migrationBuilder.AddForeignKey(
203  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
204  table: "Instances",
205  column: "WatchdogReattachInformationId",
206  principalTable: "WatchdogReattachInformations",
207  principalColumn: "Id",
208  onDelete: ReferentialAction.Restrict);
209 
210  migrationBuilder.AddForeignKey(
211  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
212  table: "TestMerges",
213  column: "PrimaryRevisionInformationId",
214  principalTable: "RevisionInformations",
215  principalColumn: "Id",
216  onDelete: ReferentialAction.SetNull);
217  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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  migrationBuilder.DropForeignKey(
18  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
19  table: "Instances");
20 
21  migrationBuilder.DropForeignKey(
22  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
23  table: "TestMerges");
24 
25  migrationBuilder.DropForeignKey(
26  name: "FK_CompileJobs_Jobs_JobId",
27  table: "CompileJobs");
28 
29  migrationBuilder.DropIndex(
30  name: "IX_Instances_WatchdogReattachInformationId",
31  table: "Instances");
32 
33  migrationBuilder.DropIndex(
34  name: "IX_CompileJobs_JobId",
35  table: "CompileJobs");
36 
37  migrationBuilder.DropColumn(
38  name: "WatchdogReattachInformationId",
39  table: "Instances");
40 
41  migrationBuilder.AddColumn<long>(
42  name: "InstanceId",
43  table: "WatchdogReattachInformations",
44  nullable: false,
45  defaultValue: 0L);
46 
47  migrationBuilder.AlterColumn<long>(
48  name: "PrimaryRevisionInformationId",
49  table: "TestMerges",
50  nullable: false,
51  oldClrType: typeof(long),
52  oldNullable: true);
53 
54  migrationBuilder.AlterColumn<string>(
55  name: "Output",
56  table: "CompileJobs",
57  nullable: false,
58  oldClrType: typeof(string),
59  oldNullable: true);
60 
61  migrationBuilder.AlterColumn<long>(
62  name: "JobId",
63  table: "CompileJobs",
64  nullable: false,
65  oldClrType: typeof(long),
66  oldNullable: true);
67 
68  migrationBuilder.AlterColumn<string>(
69  name: "DmeName",
70  table: "CompileJobs",
71  nullable: false,
72  oldClrType: typeof(string),
73  oldNullable: true);
74 
75  migrationBuilder.AlterColumn<Guid>(
76  name: "DirectoryName",
77  table: "CompileJobs",
78  nullable: false,
79  oldClrType: typeof(Guid),
80  oldNullable: true);
81 
82  migrationBuilder.CreateIndex(
83  name: "IX_WatchdogReattachInformations_InstanceId",
84  table: "WatchdogReattachInformations",
85  column: "InstanceId",
86  unique: true);
87 
88  migrationBuilder.CreateIndex(
89  name: "IX_CompileJobs_JobId",
90  table: "CompileJobs",
91  column: "JobId",
92  unique: true);
93 
94  migrationBuilder.AddForeignKey(
95  name: "FK_CompileJobs_Jobs_JobId",
96  table: "CompileJobs",
97  column: "JobId",
98  principalTable: "Jobs",
99  principalColumn: "Id",
100  onDelete: ReferentialAction.Restrict);
101 
102  migrationBuilder.AddForeignKey(
103  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
104  table: "TestMerges",
105  column: "PrimaryRevisionInformationId",
106  principalTable: "RevisionInformations",
107  principalColumn: "Id",
108  onDelete: ReferentialAction.Restrict);
109 
110  migrationBuilder.AddForeignKey(
111  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
112  table: "WatchdogReattachInformations",
113  column: "InstanceId",
114  principalTable: "Instances",
115  principalColumn: "Id",
116  onDelete: ReferentialAction.Cascade);
117  }
+
+
+
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..ebd27f7099 --- /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,112 @@ + + + + + + +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..f7eff25a7f --- /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,245 @@ + + + + + + +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 8 of file 20180926034014_MYReattachCompileJobRequired.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 40 of file 20180926034014_MYReattachCompileJobRequired.cs.

+
41  {
42  migrationBuilder.DropForeignKey(
43  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
44  table: "ReattachInformations");
45 
46  migrationBuilder.AlterColumn<long>(
47  name: "CompileJobId",
48  table: "ReattachInformations",
49  nullable: true,
50  oldClrType: typeof(long));
51 
52  migrationBuilder.AddForeignKey(
53  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
54  table: "ReattachInformations",
55  column: "CompileJobId",
56  principalTable: "CompileJobs",
57  principalColumn: "Id",
58  onDelete: ReferentialAction.Restrict);
59  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 14 of file 20180926034014_MYReattachCompileJobRequired.cs.

+
15  {
16  migrationBuilder.DropForeignKey(
17  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
18  table: "ReattachInformations");
19 
20  migrationBuilder.AlterColumn<long>(
21  name: "CompileJobId",
22  table: "ReattachInformations",
23  nullable: false,
24  oldClrType: typeof(long),
25  oldNullable: true);
26 
27  migrationBuilder.AddForeignKey(
28  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
29  table: "ReattachInformations",
30  column: "CompileJobId",
31  principalTable: "CompileJobs",
32  principalColumn: "Id",
33  onDelete: ReferentialAction.Cascade);
34  }
+
+
+
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_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..922ca6356b --- /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,110 @@ + + + + + + +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..7db3c34af4 --- /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,157 @@ + + + + + + +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 11 of file MySqlDatabaseContextModelSnapshot.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot.BuildModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Definition at line 13 of file MySqlDatabaseContextModelSnapshot.cs.

+
14  {
15 #pragma warning disable 612, 618
16  modelBuilder
17  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
18  .HasAnnotation("Relational:MaxIdentifierLength", 64);
19 
20  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
21  {
22  b.Property<long>("Id")
23  .ValueGeneratedOnAdd();
24 
25  b.Property<string>("ConnectionString")
26  .IsRequired();
27 
28  b.Property<bool?>("Enabled");
29 
30  b.Property<long>("InstanceId");
31 
32  b.Property<string>("Name")
33  .IsRequired();
34 
35  b.Property<int?>("Provider");
36 
37  b.HasKey("Id");
38 
39  b.HasIndex("InstanceId");
40 
41  b.HasIndex("Name")
42  .IsUnique();
43 
44  b.ToTable("ChatBots");
45  });
46 
47  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
48  {
49  b.Property<long>("Id")
50  .ValueGeneratedOnAdd();
51 
52  b.Property<long>("ChatSettingsId");
53 
54  b.Property<ulong?>("DiscordChannelId");
55 
56  b.Property<string>("IrcChannel");
57 
58  b.Property<bool?>("IsAdminChannel")
59  .IsRequired();
60 
61  b.Property<bool?>("IsUpdatesChannel")
62  .IsRequired();
63 
64  b.Property<bool?>("IsWatchdogChannel")
65  .IsRequired();
66 
67  b.Property<string>("Tag");
68 
69  b.HasKey("Id");
70 
71  b.HasIndex("ChatSettingsId", "DiscordChannelId")
72  .IsUnique();
73 
74  b.HasIndex("ChatSettingsId", "IrcChannel")
75  .IsUnique();
76 
77  b.ToTable("ChatChannels");
78  });
79 
80  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
81  {
82  b.Property<long>("Id")
83  .ValueGeneratedOnAdd();
84 
85  b.Property<string>("ByondVersion")
86  .IsRequired();
87 
88  b.Property<Guid?>("DirectoryName")
89  .IsRequired();
90 
91  b.Property<string>("DmeName")
92  .IsRequired();
93 
94  b.Property<long>("JobId");
95 
96  b.Property<int>("MinimumSecurityLevel");
97 
98  b.Property<string>("Output")
99  .IsRequired();
100 
101  b.Property<long>("RevisionInformationId");
102 
103  b.HasKey("Id");
104 
105  b.HasIndex("DirectoryName");
106 
107  b.HasIndex("JobId")
108  .IsUnique();
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.HasKey("Id");
199 
200  b.HasIndex("Path")
201  .IsUnique();
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  .IsRequired();
415 
416  b.Property<string>("PullRequestRevision")
417  .IsRequired();
418 
419  b.Property<string>("TitleAtMerge")
420  .IsRequired();
421 
422  b.Property<string>("Url")
423  .IsRequired();
424 
425  b.HasKey("Id");
426 
427  b.HasIndex("MergedById");
428 
429  b.HasIndex("PrimaryRevisionInformationId")
430  .IsUnique();
431 
432  b.ToTable("TestMerges");
433  });
434 
435  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
436  {
437  b.Property<long>("Id")
438  .ValueGeneratedOnAdd();
439 
440  b.Property<ulong>("AdministrationRights");
441 
442  b.Property<string>("CanonicalName")
443  .IsRequired();
444 
445  b.Property<DateTimeOffset?>("CreatedAt")
446  .IsRequired();
447 
448  b.Property<long?>("CreatedById");
449 
450  b.Property<bool?>("Enabled")
451  .IsRequired();
452 
453  b.Property<ulong>("InstanceManagerRights");
454 
455  b.Property<DateTimeOffset?>("LastPasswordUpdate");
456 
457  b.Property<string>("Name")
458  .IsRequired();
459 
460  b.Property<string>("PasswordHash");
461 
462  b.Property<string>("SystemIdentifier");
463 
464  b.HasKey("Id");
465 
466  b.HasIndex("CanonicalName")
467  .IsUnique();
468 
469  b.HasIndex("CreatedById");
470 
471  b.ToTable("Users");
472  });
473 
474  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
475  {
476  b.Property<long>("Id")
477  .ValueGeneratedOnAdd();
478 
479  b.Property<long?>("AlphaId");
480 
481  b.Property<bool>("AlphaIsActive");
482 
483  b.Property<long?>("BravoId");
484 
485  b.Property<long>("InstanceId");
486 
487  b.HasKey("Id");
488 
489  b.HasIndex("AlphaId");
490 
491  b.HasIndex("BravoId");
492 
493  b.HasIndex("InstanceId")
494  .IsUnique();
495 
496  b.ToTable("WatchdogReattachInformations");
497  });
498 
499  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
500  {
501  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
502  .WithMany("ChatSettings")
503  .HasForeignKey("InstanceId")
504  .OnDelete(DeleteBehavior.Cascade);
505  });
506 
507  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
508  {
509  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
510  .WithMany("Channels")
511  .HasForeignKey("ChatSettingsId")
512  .OnDelete(DeleteBehavior.Cascade);
513  });
514 
515  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
516  {
517  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
518  .WithOne()
519  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
520  .OnDelete(DeleteBehavior.Restrict);
521 
522  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
523  .WithMany("CompileJobs")
524  .HasForeignKey("RevisionInformationId")
525  .OnDelete(DeleteBehavior.Cascade);
526  });
527 
528  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
529  {
530  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
531  .WithOne("DreamDaemonSettings")
532  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
533  .OnDelete(DeleteBehavior.Cascade);
534  });
535 
536  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
537  {
538  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
539  .WithOne("DreamMakerSettings")
540  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
541  .OnDelete(DeleteBehavior.Cascade);
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  .OnDelete(DeleteBehavior.Cascade);
580  });
581 
582  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
583  {
584  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
585  .WithOne("RepositorySettings")
586  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
587  .OnDelete(DeleteBehavior.Cascade);
588  });
589 
590  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
591  {
592  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
593  .WithMany("ActiveTestMerges")
594  .HasForeignKey("RevisionInformationId")
595  .OnDelete(DeleteBehavior.Cascade);
596 
597  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
598  .WithMany("RevisonInformations")
599  .HasForeignKey("TestMergeId")
600  .OnDelete(DeleteBehavior.Cascade);
601  });
602 
603  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
604  {
605  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
606  .WithMany("RevisionInformations")
607  .HasForeignKey("InstanceId")
608  .OnDelete(DeleteBehavior.Cascade);
609  });
610 
611  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
612  {
613  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
614  .WithMany("TestMerges")
615  .HasForeignKey("MergedById")
616  .OnDelete(DeleteBehavior.Restrict);
617 
618  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
619  .WithOne("PrimaryTestMerge")
620  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
621  .OnDelete(DeleteBehavior.Restrict);
622  });
623 
624  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
625  {
626  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
627  .WithMany("CreatedUsers")
628  .HasForeignKey("CreatedById");
629  });
630 
631  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
632  {
633  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
634  .WithMany()
635  .HasForeignKey("AlphaId");
636 
637  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
638  .WithMany()
639  .HasForeignKey("BravoId");
640 
641  b.HasOne("Tgstation.Server.Host.Models.Instance")
642  .WithOne("WatchdogReattachInformation")
643  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
644  .OnDelete(DeleteBehavior.Cascade);
645  });
646 #pragma warning restore 612, 618
647  }
+
+
+
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..e7d0b06986 --- /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,110 @@ + + + + + + +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..a7bf9a2d8c --- /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,152 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
MySqlDatabaseContext Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory.CreateDbContext (string[] args)
+
+ +

+ +
+
+
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..899e93c392 --- /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,157 @@ + + + + + + +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 12 of file SqlServerDatabaseContextModelSnapshot.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot.BuildModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Definition at line 14 of file SqlServerDatabaseContextModelSnapshot.cs.

+
15  {
16 #pragma warning disable 612, 618
17  modelBuilder
18  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
19  .HasAnnotation("Relational:MaxIdentifierLength", 128)
20  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
21 
22  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
23  {
24  b.Property<long>("Id")
25  .ValueGeneratedOnAdd()
26  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
27 
28  b.Property<string>("ConnectionString")
29  .IsRequired();
30 
31  b.Property<bool?>("Enabled");
32 
33  b.Property<long>("InstanceId");
34 
35  b.Property<string>("Name")
36  .IsRequired();
37 
38  b.Property<int?>("Provider");
39 
40  b.HasKey("Id");
41 
42  b.HasIndex("InstanceId");
43 
44  b.HasIndex("Name")
45  .IsUnique();
46 
47  b.ToTable("ChatBots");
48  });
49 
50  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
51  {
52  b.Property<long>("Id")
53  .ValueGeneratedOnAdd()
54  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<decimal?>("DiscordChannelId")
59  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
60 
61  b.Property<string>("IrcChannel");
62 
63  b.Property<bool?>("IsAdminChannel")
64  .IsRequired();
65 
66  b.Property<bool?>("IsUpdatesChannel")
67  .IsRequired();
68 
69  b.Property<bool?>("IsWatchdogChannel")
70  .IsRequired();
71 
72  b.Property<string>("Tag");
73 
74  b.HasKey("Id");
75 
76  b.HasIndex("ChatSettingsId", "DiscordChannelId")
77  .IsUnique()
78  .HasFilter("[DiscordChannelId] IS NOT NULL");
79 
80  b.HasIndex("ChatSettingsId", "IrcChannel")
81  .IsUnique()
82  .HasFilter("[IrcChannel] IS NOT NULL");
83 
84  b.ToTable("ChatChannels");
85  });
86 
87  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
88  {
89  b.Property<long>("Id")
90  .ValueGeneratedOnAdd()
91  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
92 
93  b.Property<string>("ByondVersion")
94  .IsRequired();
95 
96  b.Property<Guid?>("DirectoryName")
97  .IsRequired();
98 
99  b.Property<string>("DmeName")
100  .IsRequired();
101 
102  b.Property<long>("JobId");
103 
104  b.Property<int>("MinimumSecurityLevel");
105 
106  b.Property<string>("Output")
107  .IsRequired();
108 
109  b.Property<long>("RevisionInformationId");
110 
111  b.HasKey("Id");
112 
113  b.HasIndex("DirectoryName");
114 
115  b.HasIndex("JobId")
116  .IsUnique();
117 
118  b.HasIndex("RevisionInformationId");
119 
120  b.ToTable("CompileJobs");
121  });
122 
123  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
124  {
125  b.Property<long>("Id")
126  .ValueGeneratedOnAdd()
127  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
128 
129  b.Property<string>("AccessToken");
130 
131  b.Property<bool?>("AllowWebClient")
132  .IsRequired();
133 
134  b.Property<bool?>("AutoStart")
135  .IsRequired();
136 
137  b.Property<long>("InstanceId");
138 
139  b.Property<int>("PrimaryPort");
140 
141  b.Property<int?>("ProcessId");
142 
143  b.Property<int>("SecondaryPort");
144 
145  b.Property<int>("SecurityLevel");
146 
147  b.Property<bool?>("SoftRestart")
148  .IsRequired();
149 
150  b.Property<bool?>("SoftShutdown")
151  .IsRequired();
152 
153  b.Property<long>("StartupTimeout");
154 
155  b.HasKey("Id");
156 
157  b.HasIndex("InstanceId")
158  .IsUnique();
159 
160  b.ToTable("DreamDaemonSettings");
161  });
162 
163  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
164  {
165  b.Property<long>("Id")
166  .ValueGeneratedOnAdd()
167  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
168 
169  b.Property<int>("ApiValidationPort");
170 
171  b.Property<int>("ApiValidationSecurityLevel");
172 
173  b.Property<long>("InstanceId");
174 
175  b.Property<string>("ProjectName");
176 
177  b.HasKey("Id");
178 
179  b.HasIndex("InstanceId")
180  .IsUnique();
181 
182  b.ToTable("DreamMakerSettings");
183  });
184 
185  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
186  {
187  b.Property<long>("Id")
188  .ValueGeneratedOnAdd()
189  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
190 
191  b.Property<long>("AutoUpdateInterval");
192 
193  b.Property<int>("ConfigurationType");
194 
195  b.Property<string>("Name")
196  .IsRequired();
197 
198  b.Property<bool?>("Online")
199  .IsRequired();
200 
201  b.Property<string>("Path")
202  .IsRequired();
203 
204  b.HasKey("Id");
205 
206  b.HasIndex("Path")
207  .IsUnique();
208 
209  b.ToTable("Instances");
210  });
211 
212  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
213  {
214  b.Property<long>("Id")
215  .ValueGeneratedOnAdd()
216  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
217 
218  b.Property<decimal>("ByondRights")
219  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
220 
221  b.Property<decimal>("ChatBotRights")
222  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
223 
224  b.Property<decimal>("ConfigurationRights")
225  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
226 
227  b.Property<decimal>("DreamDaemonRights")
228  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
229 
230  b.Property<decimal>("DreamMakerRights")
231  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
232 
233  b.Property<long>("InstanceId");
234 
235  b.Property<decimal>("InstanceUserRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<decimal>("RepositoryRights")
239  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
240 
241  b.Property<long?>("UserId")
242  .IsRequired();
243 
244  b.HasKey("Id");
245 
246  b.HasIndex("InstanceId");
247 
248  b.HasIndex("UserId", "InstanceId")
249  .IsUnique();
250 
251  b.ToTable("InstanceUsers");
252  });
253 
254  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
255  {
256  b.Property<long>("Id")
257  .ValueGeneratedOnAdd()
258  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
259 
260  b.Property<decimal?>("CancelRight")
261  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
262 
263  b.Property<decimal?>("CancelRightsType")
264  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
265 
266  b.Property<bool?>("Cancelled")
267  .IsRequired();
268 
269  b.Property<long?>("CancelledById");
270 
271  b.Property<string>("Description")
272  .IsRequired();
273 
274  b.Property<string>("ExceptionDetails");
275 
276  b.Property<long>("InstanceId");
277 
278  b.Property<DateTimeOffset?>("StartedAt")
279  .IsRequired();
280 
281  b.Property<long>("StartedById");
282 
283  b.Property<DateTimeOffset?>("StoppedAt");
284 
285  b.HasKey("Id");
286 
287  b.HasIndex("CancelledById");
288 
289  b.HasIndex("InstanceId");
290 
291  b.HasIndex("StartedById");
292 
293  b.ToTable("Jobs");
294  });
295 
296  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
297  {
298  b.Property<long>("Id")
299  .ValueGeneratedOnAdd()
300  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
301 
302  b.Property<string>("AccessIdentifier")
303  .IsRequired();
304 
305  b.Property<string>("ChatChannelsJson")
306  .IsRequired();
307 
308  b.Property<string>("ChatCommandsJson")
309  .IsRequired();
310 
311  b.Property<long>("CompileJobId");
312 
313  b.Property<bool>("IsPrimary");
314 
315  b.Property<int>("Port");
316 
317  b.Property<int>("ProcessId");
318 
319  b.Property<int>("RebootState");
320 
321  b.Property<string>("ServerCommandsJson")
322  .IsRequired();
323 
324  b.HasKey("Id");
325 
326  b.HasIndex("CompileJobId");
327 
328  b.ToTable("ReattachInformations");
329  });
330 
331  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
332  {
333  b.Property<long>("Id")
334  .ValueGeneratedOnAdd()
335  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
336 
337  b.Property<string>("AccessToken");
338 
339  b.Property<string>("AccessUser");
340 
341  b.Property<bool?>("AutoUpdatesKeepTestMerges")
342  .IsRequired();
343 
344  b.Property<bool?>("AutoUpdatesSynchronize")
345  .IsRequired();
346 
347  b.Property<string>("CommitterEmail")
348  .IsRequired();
349 
350  b.Property<string>("CommitterName")
351  .IsRequired();
352 
353  b.Property<long>("InstanceId");
354 
355  b.Property<bool?>("PushTestMergeCommits")
356  .IsRequired();
357 
358  b.Property<bool?>("ShowTestMergeCommitters")
359  .IsRequired();
360 
361  b.HasKey("Id");
362 
363  b.HasIndex("InstanceId")
364  .IsUnique();
365 
366  b.ToTable("RepositorySettings");
367  });
368 
369  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
370  {
371  b.Property<long>("Id")
372  .ValueGeneratedOnAdd()
373  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
374 
375  b.Property<long>("RevisionInformationId");
376 
377  b.Property<long>("TestMergeId");
378 
379  b.HasKey("Id");
380 
381  b.HasIndex("RevisionInformationId");
382 
383  b.HasIndex("TestMergeId");
384 
385  b.ToTable("RevInfoTestMerges");
386  });
387 
388  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
389  {
390  b.Property<long>("Id")
391  .ValueGeneratedOnAdd()
392  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
393 
394  b.Property<string>("CommitSha")
395  .IsRequired()
396  .HasMaxLength(40);
397 
398  b.Property<long>("InstanceId");
399 
400  b.Property<string>("OriginCommitSha")
401  .IsRequired()
402  .HasMaxLength(40);
403 
404  b.HasKey("Id");
405 
406  b.HasIndex("CommitSha")
407  .IsUnique();
408 
409  b.HasIndex("InstanceId");
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..e59fc083b4 --- /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,110 @@ + + + + + + +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..513ccff1fd --- /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,152 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
SqlServerDatabaseContext Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory.CreateDbContext (string[] args)
+
+ +

+ +
+
+
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 >
TestMergesTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
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..c1c4abb8c7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html @@ -0,0 +1,284 @@ + + + + + + +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)
 
+ + + + + + +

+Protected Member Functions

override void OnConfiguring (DbContextOptionsBuilder options)
 
- 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.MySqlDatabaseContext.OnConfiguring (DbContextOptionsBuilder options)
+
+protected
+
+ +

+ +

Definition at line 27 of file MySqlDatabaseContext.cs.

+ +

References Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString, Tgstation.Server.Host.Configuration.DatabaseConfiguration.DatabaseType, and Tgstation.Server.Host.Configuration.DatabaseConfiguration.MySqlServerVersion.

+
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>
+
+
+
+
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..d0a10cf00f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information-members.html @@ -0,0 +1,124 @@ + + + + + + +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..43fb6e61d5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html @@ -0,0 +1,235 @@ + + + + + + +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 Tgstation.Server.Host.Models.ReattachInformation.CompileJob
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ReattachInformation.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 13 of file ReattachInformation.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_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..281e3ad565 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base-members.html @@ -0,0 +1,122 @@ + + + + + + +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..90f388a992 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html @@ -0,0 +1,401 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase ()
+
+protected
+
+ +

Construct a ReattachInformationBase

+ +

Definition at line 43 of file ReattachInformationBase.cs.

+
43 { }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +

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.

+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
override string Tgstation.Server.Host.Models.ReattachInformationBase.ToString ()
+
+ +

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier
+
+getset
+
+ +

Used to identify and authenticate the DreamDaemon instance

+ +

Definition at line 18 of file ReattachInformationBase.cs.

+ +

Referenced by Tgstation.Server.Host.Components.ReattachInfoHandler.ReattachInfoHandler(), and Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Models.ReattachInformationBase.IsPrimary
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Host.Models.ReattachInformationBase.Port
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
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..94c67ea7ab --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html @@ -0,0 +1,264 @@ + + + + + + +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...
 
+

Detailed Description

+
+

Definition at line 8 of file RepositorySettings.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + +
Repository Tgstation.Server.Host.Models.RepositorySettings.ToApi ()
+
+ +

Convert the Repository to it's API form

+
Returns
A new Api.Models.Repository
+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RepositorySettings.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 13 of file RepositorySettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.RepositorySettings.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 24 of file RepositorySettings.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RepositorySettings.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 18 of file RepositorySettings.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_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..f8a5362bff --- /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,112 @@ + + + + + + +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..1be923b7db --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html @@ -0,0 +1,205 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RevInfoTestMerge.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 13 of file RevInfoTestMerge.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Models.RevInfoTestMerge.RevisionInformation
+
+getset
+
+ +

The Models.RevisionInformation

+ +

Definition at line 25 of file RevInfoTestMerge.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
TestMerge Tgstation.Server.Host.Models.RevInfoTestMerge.TestMerge
+
+getset
+
+ +

The Models.TestMerge

+ +

Definition at line 19 of file RevInfoTestMerge.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_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..b5ca6575df --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information-members.html @@ -0,0 +1,117 @@ + + + + + + +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..4a2c26a8e7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html @@ -0,0 +1,304 @@ + + + + + + +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...
 
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

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
List<RevInfoTestMerge> Tgstation.Server.Host.Models.RevisionInformation.ActiveTestMerges
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
List<CompileJob> Tgstation.Server.Host.Models.RevisionInformation.CompileJobs
+
+getset
+
+ +

See CompileJobs made from this RevisionInformation

+ +

Definition at line 34 of file RevisionInformation.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RevisionInformation.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 13 of file RevisionInformation.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.RevisionInformation.Instance
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
TestMerge Tgstation.Server.Host.Models.RevisionInformation.PrimaryTestMerge
+
+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_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..cc507c4986 --- /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,132 @@ + + + + + + +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 >
SqlServerDatabaseContext(DbContextOptions< SqlServerDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< SqlServerDatabaseContext > logger)Tgstation.Server.Host.Models.SqlServerDatabaseContext
TestMergesTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
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..2d0e512c34 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html @@ -0,0 +1,280 @@ + + + + + + +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)
 
+ + + + + + +

+Protected Member Functions

override void OnConfiguring (DbContextOptionsBuilder options)
 
- 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.SqlServerDatabaseContext.OnConfiguring (DbContextOptionsBuilder options)
+
+protected
+
+ +

+ +

Definition at line 24 of file SqlServerDatabaseContext.cs.

+ +

References Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString.

+
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>
+
+
+
+
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..9b9dc42cd7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge-members.html @@ -0,0 +1,125 @@ + + + + + + +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..ebe45da0dd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html @@ -0,0 +1,310 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.TestMerge.MergedBy
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Models.TestMerge.PrimaryRevisionInformation
+
+getset
+
+ +

The initial RevisionInformation the TestMerge was merged with

+ +

Definition at line 19 of file TestMerge.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.TestMerge.PrimaryRevisionInformationId
+
+getset
+
+ +

Foreign key for PrimaryRevisionInformation

+ +

Definition at line 24 of file TestMerge.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<RevInfoTestMerge> Tgstation.Server.Host.Models.TestMerge.RevisonInformations
+
+getset
+
+ +

All the RevInfoTestMerge for the TestMerge

+ +

Definition at line 29 of file TestMerge.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_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..448deb7d0b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html @@ -0,0 +1,431 @@ + + + + + + +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...
 
AdministrationRights AdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRights InstanceManagerRights [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

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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
+ +
+
+ +
+
+ + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.User.CreatedBy
+
+getset
+
+ +

See Api.Models.User

+ +

Definition at line 18 of file User.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<User> Tgstation.Server.Host.Models.User.CreatedUsers
+
+getset
+
+ +

Users created by this User

+ +

Definition at line 34 of file User.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<InstanceUser> Tgstation.Server.Host.Models.User.InstanceUsers
+
+getset
+
+ +

The InstanceUsers for the User

+ +

Definition at line 39 of file User.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Host.Models.User.LastPasswordUpdate
+
+getset
+
+ +

When PasswordHash was last changed

+ +

Definition at line 29 of file User.cs.

+ +

Referenced by Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword().

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.User.PasswordHash
+
+getset
+
+ +

The hash of the user's password

+ +

Definition at line 13 of file User.cs.

+ +

Referenced by Tgstation.Server.Host.Security.CryptographySuite.CheckUserPassword(), and Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword().

+ +
+
+ +
+
+ + + + + +
+ + + + +
List<TestMerge> Tgstation.Server.Host.Models.User.TestMerges
+
+getset
+
+ +

The TestMerges made by the User

+ +

Definition at line 44 of file User.cs.

+ +
+
+
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..c642cd2e60 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information-members.html @@ -0,0 +1,116 @@ + + + + + + +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..d61a1be11f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html @@ -0,0 +1,256 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
ReattachInformation Tgstation.Server.Host.Models.WatchdogReattachInformation.Alpha
+
+getset
+
+ +

The ReattachInformation for the Alpha server

+ +

Definition at line 21 of file WatchdogReattachInformation.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ReattachInformation Tgstation.Server.Host.Models.WatchdogReattachInformation.Bravo
+
+getset
+
+ +

The ReattachInformation for the Bravo server

+ +

Definition at line 26 of file WatchdogReattachInformation.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.WatchdogReattachInformation.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file WatchdogReattachInformation.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..a3a840f04a --- /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,112 @@ + + + + + + +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..75de6802bc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html @@ -0,0 +1,234 @@ + + + + + + +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

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Models.WatchdogReattachInformationBase.WatchdogReattachInformationBase ()
+
+ +

Construct a WatchdogReattachInformationBase

+ +

Definition at line 18 of file WatchdogReattachInformationBase.cs.

+
18 { }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive.

+
25  {
26  AlphaIsActive = copy?.AlphaIsActive ?? throw new ArgumentNullException(nameof(copy));
27  }
+
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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..4d49d53f71 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_native_methods.html @@ -0,0 +1,484 @@ + + + + + + +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 10 of file NativeMethods.cs.

+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
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 16 of file NativeMethods.cs.

+
16  : int
17  {
18  None = 0,
19  Directory = 1,
20  AllowUnprivilegedCreate = 2
21  }
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static bool Tgstation.Server.Host.NativeMethods.CreateSymbolicLink (string lpSymlinkFileName,
string lpTargetFileName,
CreateSymbolicLinkFlags dwFlags 
)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static bool Tgstation.Server.Host.NativeMethods.EnumChildWindows (IntPtr window,
EnumWindowProc callback,
IntPtr lParam 
)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
delegate bool Tgstation.Server.Host.NativeMethods.EnumWindowProc (IntPtr hwnd,
IntPtr lParam 
)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
static IntPtr Tgstation.Server.Host.NativeMethods.FindWindow (string lpClassName,
string lpWindowName 
)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static int Tgstation.Server.Host.NativeMethods.GetWindowText (IntPtr hWnd,
StringBuilder lpString,
int nMaxCount 
)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
static int Tgstation.Server.Host.NativeMethods.GetWindowThreadProcessId (IntPtr hWnd,
out int lpdwProcessId 
)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static bool Tgstation.Server.Host.NativeMethods.LogonUser (string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken 
)
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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..6762644f7e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_program-members.html @@ -0,0 +1,110 @@ + + + + + + +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
+ + + + 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..d474949c65 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_program.html @@ -0,0 +1,167 @@ + + + + + + +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...
 
+

Detailed Description

+

Entrypoint for the Process

+ +

Definition at line 13 of file Program.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
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 25 of file Program.cs.

+ +

References Tgstation.Server.Host.IServerFactory.CreateServer(), and Tgstation.Server.Host.IServer.RunAsync().

+
26  {
27  var listArgs = new List<string>(args);
28  //first arg is 100% always the update path, starting it otherwise is solely for debugging purposes
29  string updatePath;
30  if (listArgs.Count > 0)
31  {
32  updatePath = listArgs[0];
33  listArgs.RemoveAt(0);
34  if (listArgs.Remove("--attach-debugger"))
35  Debugger.Launch();
36  }
37  else
38  updatePath = null;
39  try
40  {
41  var server = serverFactory.CreateServer(listArgs.ToArray(), updatePath);
42  try
43  {
44  using (var cts = new CancellationTokenSource())
45  {
46  void AppDomainHandler(object a, EventArgs b) => cts.Cancel();
47  AppDomain.CurrentDomain.ProcessExit += AppDomainHandler;
48  try
49  {
50  Console.CancelKeyPress += (a, b) =>
51  {
52  b.Cancel = true;
53  cts.Cancel();
54  };
55  await server.RunAsync(cts.Token).ConfigureAwait(false);
56  }
57  finally
58  {
59  AppDomain.CurrentDomain.ProcessExit -= AppDomainHandler;
60  }
61  }
62  }
63  catch (OperationCanceledException) { }
64  return server.RestartRequested ? 1 : 0;
65  }
66  catch (Exception e)
67  {
68  if (updatePath != null)
69  {
70  File.WriteAllText(updatePath, e.ToString());
71  return 2;
72  }
73  throw;
74  }
75  }
+
Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
+
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+
+
+
+
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..85d8ecd494 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context-members.html @@ -0,0 +1,116 @@ + + + + + + +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..b74908b6a8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html @@ -0,0 +1,362 @@ + + + + + + +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

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext ()
+
+ +

Construct an empty AuthenticationContext

+ +

Definition at line 25 of file AuthenticationContext.cs.

+
25 { }
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.Models.Internal.User.SystemIdentifier.

+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.AuthenticationContext.Dispose ()
+
+ +

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +

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().

+
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  // use the api versions because they're the ones that contain the actual properties
57  var typeToCheck = isInstance ? typeof(InstanceUser) : typeof(User);
58 
59  var nullableType = typeof(Nullable<>);
60  var nullableRightsType = nullableType.MakeGenericType(rightsEnum);
61 
62  var prop = typeToCheck.GetProperties().Where(x => x.PropertyType == nullableRightsType).First();
63 
64  var right = prop.GetMethod.Invoke(isInstance ? (object)InstanceUser : User, Array.Empty<object>());
65 
66  if (right == null)
67  throw new InvalidOperationException("A user right was null!");
68  return (ulong)right;
69  }
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
+
+
+
+

Property Documentation

+ + + +
+
+ + + + + +
+ + + + +
ISystemIdentity Tgstation.Server.Host.Security.AuthenticationContext.SystemIdentity
+
+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_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..c872feccae --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory-members.html @@ -0,0 +1,116 @@ + + + + + + +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..218535dcbb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html @@ -0,0 +1,377 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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  systemIdentity = null;
80  }
81 
82  try
83  {
84  var instanceUser = await instanceUserQuery.ConfigureAwait(false);
85 
86  CurrentAuthenticationContext = new AuthenticationContext(systemIdentity, user, instanceUser);
87  }
88  catch
89  {
90  systemIdentity?.Dispose();
91  throw;
92  }
93  }
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
+
+
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.AuthenticationContextFactory.Dispose ()
+
+ +

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContext Tgstation.Server.Host.Security.AuthenticationContextFactory.databaseContext
+
+private
+
+ +

The IDatabaseContext for the AuthenticationContextFactory

+ +

Definition at line 24 of file AuthenticationContextFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IIdentityCache Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache
+
+private
+
+ +

The IIdentityCache for the AuthenticationContextFactory

+ +

Definition at line 29 of file AuthenticationContextFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ISystemIdentityFactory Tgstation.Server.Host.Security.AuthenticationContextFactory.systemIdentityFactory
+
+private
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
IAuthenticationContext Tgstation.Server.Host.Security.AuthenticationContextFactory.CurrentAuthenticationContext
+
+getprivate set
+
+ +

+ +

Definition at line 14 of file AuthenticationContextFactory.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_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..e851d31cdb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html @@ -0,0 +1,282 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Api.ApiHeaders.InstanceId, Tgstation.Server.Api.Rights.RightsHelper.IsInstanceRight(), Tgstation.Server.Api.Rights.RightsHelper.RightToType(), and Tgstation.Server.Api.Rights.RightsHelper.RoleName().

+
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
+ +
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
readonly IAuthenticationContextFactory authenticationContextFactory
The IAuthenticationContextFactory for the ClaimsInjector
+
Task CreateAuthenticationContext(long userId, long?instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
Create an IAuthenticationContext to populate CurrentAuthenticationContext
+
static Type RightToType(RightsType rightsType)
Map a given rightsType to its respective Enum Type
+
IAuthenticationContext CurrentAuthenticationContext
The IAuthenticationContext the IAuthenticationContextFactory created
+
long InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
static string RoleName(RightsType rightsType, Enum right)
Gets the role claim name used for a given rightsType and right
Definition: RightsHelper.cs:61
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAuthenticationContextFactory Tgstation.Server.Host.Security.ClaimsInjector.authenticationContextFactory
+
+private
+
+ +

The IAuthenticationContextFactory for the ClaimsInjector

+ +

Definition at line 27 of file ClaimsInjector.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContext Tgstation.Server.Host.Security.ClaimsInjector.databaseContext
+
+private
+
+ +

The IDatabaseContext for the ClaimsInjector

+ +

Definition at line 22 of file ClaimsInjector.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_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..781d3742d0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html @@ -0,0 +1,355 @@ + + + + + + +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 9 of file CryptographySuite.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Security.CryptographySuite.CryptographySuite (IPasswordHasher< UserpasswordHasher)
+
+ +

Construct a CryptographySuite

+
Parameters
+ + +
passwordHasherThe value of passwordHasher
+
+
+ +

Definition at line 25 of file CryptographySuite.cs.

+
26  {
27  this.passwordHasher = passwordHasher ?? throw new ArgumentNullException(nameof(passwordHasher));
28  }
readonly IPasswordHasher< User > passwordHasher
The IPasswordHasher<TUser> for the CryptographySuite
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 54 of file CryptographySuite.cs.

+ +

References Tgstation.Server.Host.Models.User.PasswordHash.

+
55  {
56  switch (passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password))
57  {
58  case PasswordVerificationResult.Failed:
59  return false;
60  case PasswordVerificationResult.SuccessRehashNeeded:
61  SetUserPassword(user, password, false);
62  break;
63  }
64  return true;
65  }
string PasswordHash
The hash of the user&#39;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
+
+
+
+ +
+
+ + + + + + + + +
byte [] Tgstation.Server.Host.Security.CryptographySuite.GetSecureBytes (uint amount)
+
+ +

Generates a secure set of bytes

+ +

Implements Tgstation.Server.Host.Security.ICryptographySuite.

+ +

Definition at line 31 of file CryptographySuite.cs.

+
32  {
33  using (var rng = new RNGCryptoServiceProvider())
34  {
35  var byt = new byte[amount];
36  rng.GetBytes(byt);
37  return byt;
38  }
39  }
+
+
+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Security.CryptographySuite.GetSecureString ()
+
+ +

Generates a 40-length secure ascii string

+ +

Implements Tgstation.Server.Host.Security.ICryptographySuite.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 42 of file CryptographySuite.cs.

+ +

References Tgstation.Server.Host.Models.User.LastPasswordUpdate, and Tgstation.Server.Host.Models.User.PasswordHash.

+
43  {
44  if (user == null)
45  throw new ArgumentNullException(nameof(user));
46  if (newPassword == null)
47  throw new ArgumentNullException(nameof(newPassword));
48  user.PasswordHash = passwordHasher.HashPassword(user, newPassword);
49  if (!newUser)
50  user.LastPasswordUpdate = DateTimeOffset.Now;
51  }
string PasswordHash
The hash of the user&#39;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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IPasswordHasher<User> Tgstation.Server.Host.Security.CryptographySuite.passwordHasher
+
+private
+
+ +

The IPasswordHasher<TUser> for the CryptographySuite

+ +

Definition at line 19 of file CryptographySuite.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const uint Tgstation.Server.Host.Security.CryptographySuite.SecureStringLength = 30
+
+private
+
+ +

Length in bytes of generated base64 secure string

+ +

Definition at line 14 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..4703790def --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache-members.html @@ -0,0 +1,116 @@ + + + + + + +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..7a0d3475c9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html @@ -0,0 +1,360 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Security.ISystemIdentity.Clone(), Tgstation.Server.Api.Models.Internal.User.Id, and Tgstation.Server.Host.Security.ISystemIdentity.Uid.

+
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  identCache = new IdentityCacheObject(systemIdentity.Clone(), asyncDelayer, () =>
67  {
68  logger.LogDebug("Expiring system identity cache for user {1}", uid, user.Id);
69  lock (cachedIdentities)
70  cachedIdentities.Remove(user.Id);
71  }, expiry);
72  cachedIdentities.Add(user.Id, identCache);
73  }
74  }
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
+
+
+
+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
ISystemIdentity Tgstation.Server.Host.Security.IdentityCache.LoadCachedIdentity (User user)
+
+ +

Attempt to load a cached ISystemIdentity

+ +

Implements Tgstation.Server.Host.Security.IIdentityCache.

+ +

Definition at line 77 of file IdentityCache.cs.

+ +

References Tgstation.Server.Api.Models.Internal.User.Id.

+
78  {
79  if (user == null)
80  throw new ArgumentNullException(nameof(user));
81  lock (cachedIdentities)
82  if (cachedIdentities.TryGetValue(user.Id, out var identity))
83  return identity.SystemIdentity.Clone();
84  throw new InvalidOperationException("Cached system identity has expired!");
85  }
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Security.IdentityCache.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the IdentityCache

+ +

Definition at line 16 of file IdentityCache.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<long, IdentityCacheObject> Tgstation.Server.Host.Security.IdentityCache.cachedIdentities
+
+private
+
+ +

The map of Api.Models.Internal.User.Ids to IdentityCacheObjects

+ +

Definition at line 26 of file IdentityCache.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly ILogger<IdentityCache> Tgstation.Server.Host.Security.IdentityCache.logger
+
+private
+
+ +

The ILogger for the IdentityCache

+ +

Definition at line 21 of file IdentityCache.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_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..4c64b4d421 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html @@ -0,0 +1,308 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Core.IAsyncDelayer.Delay().

+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Security.IdentityCacheObject.cancellationTokenSource
+
+private
+
+ +

The cancellationTokenSource for the IdentityCache

+ +

Definition at line 21 of file IdentityCacheObject.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Task Tgstation.Server.Host.Security.IdentityCacheObject.task
+
+private
+
+ +

The Task to clean up SystemIdentity

+ +

Definition at line 26 of file IdentityCacheObject.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ISystemIdentity Tgstation.Server.Host.Security.IdentityCacheObject.SystemIdentity
+
+get
+
+ +

The ISystemIdentity the IdentityCache manages

+ +

Definition at line 16 of file IdentityCacheObject.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_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..9ff49f44cf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html @@ -0,0 +1,206 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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..fe321a7484 --- /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,169 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+ +
+
+
+ +
+
+ + + + + + + +
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..cdfd07aafa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory-members.html @@ -0,0 +1,116 @@ + + + + + + +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..8b7ff879ed --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html @@ -0,0 +1,367 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

References Tgstation.Server.Host.Security.ICryptographySuite.GetSecureBytes().

+
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
+
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 
77  var nowUnix = now.ToUnixTimeSeconds();
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Security.TokenFactory.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the TokenFactory

+ +

Definition at line 38 of file TokenFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
TokenValidationParameters Tgstation.Server.Host.Security.TokenFactory.ValidationParameters
+
+get
+
+ +

+ +

Definition at line 33 of file TokenFactory.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_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..da7be801b9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity-members.html @@ -0,0 +1,118 @@ + + + + + + +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..49c1d9ebe8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html @@ -0,0 +1,386 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + +
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
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
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 
68  var newIdentity = new WindowsIdentity(identity.Token); //the handle is cloned internally
69 
70  return new WindowsSystemIdentity(newIdentity);
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
+
+
+
+ +
+
+ + + + + + + +
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly WindowsIdentity Tgstation.Server.Host.Security.WindowsSystemIdentity.identity
+
+private
+
+ +

The WindowsIdentity for the WindowsSystemIdentity

+ +

Definition at line 23 of file WindowsSystemIdentity.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Security.WindowsSystemIdentity.Uid => (userPrincipal?.Sid ?? identity.User).ToString()
+
+ +

+ +

Definition at line 15 of file WindowsSystemIdentity.cs.

+ +
+
+ +
+
+ + + + +
string Tgstation.Server.Host.Security.WindowsSystemIdentity.Username => userPrincipal?.Name ?? identity.Name
+
+ +

+ +

Definition at line 18 of file WindowsSystemIdentity.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly UserPrincipal Tgstation.Server.Host.Security.WindowsSystemIdentity.userPrincipal
+
+private
+
+ +

The UserPrincipal for the WindowsSystemIdentity

+ +

Definition at line 28 of file WindowsSystemIdentity.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_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..31c3fffc95 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html @@ -0,0 +1,329 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.WindowsSystemIdentityFactory (ILogger< WindowsSystemIdentityFactorylogger)
+
+ +

Construct a WindowsSystemIdentityFactory

+
Parameters
+ + +
loggerThe value of logger
+
+
+ +

Definition at line 39 of file WindowsSystemIdentityFactory.cs.

+ +

References Tgstation.Server.Host.NativeMethods.LogonUser(), and Tgstation.Server.Api.Models.Internal.User.SystemIdentifier.

+
40  {
41  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
42  }
readonly ILogger< WindowsSystemIdentityFactory > logger
The ILogger for the WindowsSystemIdentityFactory
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+
+
+ +

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

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<WindowsSystemIdentityFactory> Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.logger
+
+private
+
+ +

The ILogger for the WindowsSystemIdentityFactory

+ +

Definition at line 20 of file WindowsSystemIdentityFactory.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_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..27160423e4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_server.html @@ -0,0 +1,631 @@ + + + + + + +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...
 
+ + + +

+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]
 if live updates are supported, . ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this is More...
 
+ + + + + + + +

+Private Member Functions

void CheckSanity (bool checkWatchdog)
 Throws an InvalidOperationException if the IServerControl cannot be used More...
 
async Task Restart (Version newVersion)
 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...
 
CancellationTokenSource cancellationTokenSource
 The cancellationTokenSource for the Server More...
 
bool updating
 If a server update has been or is being applied More...
 
+

Detailed Description

+
+

Definition at line 17 of file Server.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Server.Server (IWebHostBuilder webHostBuilder,
string updatePath 
)
+
+ +

Construct a Server

+
Parameters
+ + + +
webHostBuilderThe value of webHostBuilder
updatePathThe value of updatePath
+
+
+ +

Definition at line 61 of file Server.cs.

+
62  {
63  this.webHostBuilder = webHostBuilder ?? throw new ArgumentNullException(nameof(webHostBuilder));
64  this.updatePath = updatePath;
65 
66  restartHandlers = new List<IRestartHandler>();
67  }
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:34
+
readonly string updatePath
The absolute path to install updates to
Definition: Server.cs:39
+
readonly IWebHostBuilder webHostBuilder
The IWebHostBuilder for the Server
Definition: Server.cs:29
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 110 of file Server.cs.

+ +

References Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.IO.IIOManager.DownloadFile(), and Tgstation.Server.Host.IO.IIOManager.ZipToDirectory().

+
111  {
112  if (version == null)
113  throw new ArgumentNullException(nameof(version));
114  if (updateZipUrl == null)
115  throw new ArgumentNullException(nameof(updateZipUrl));
116  if (ioManager == null)
117  throw new ArgumentNullException(nameof(ioManager));
118 
119  CheckSanity(true);
120 
121  logger.LogTrace("Begin ApplyUpdate...");
122 
123  lock (this)
124  {
125  if (updating || RestartRequested)
126  {
127  logger.LogTrace("Aborted due to concurrency conflict!");
128  return false;
129  }
130  updating = true;
131  }
132 
133  async void RunUpdate()
134  {
135  try
136  {
137  logger.LogInformation("Updating server to version {0} ({1})...", version, updateZipUrl);
138 
139  if (cancellationTokenSource == null)
140  throw new InvalidOperationException("Tried to update a non-running Server!");
141  var cancellationToken = cancellationTokenSource.Token;
142 
143  logger.LogTrace("Downloading zip package...");
144  var updateZipData = await ioManager.DownloadFile(updateZipUrl, cancellationToken).ConfigureAwait(false);
145 
146  try
147  {
148  logger.LogTrace("Exctracting zip package to {0}...", updatePath);
149  await ioManager.ZipToDirectory(updatePath, updateZipData, cancellationToken).ConfigureAwait(false);
150  }
151  catch (Exception e)
152  {
153  updating = false;
154  try
155  {
156  //important to not leave this directory around if possible
157  await ioManager.DeleteDirectory(updatePath, default).ConfigureAwait(false);
158  }
159  catch (Exception e2)
160  {
161  throw new AggregateException(e, e2);
162  }
163  throw;
164  }
165 
166  await Restart(version).ConfigureAwait(false);
167  }
168  catch (OperationCanceledException)
169  {
170  logger.LogInformation("Server update cancelled!");
171  }
172  catch (Exception e)
173  {
174  logger.LogError("Error updating server! Exception: {0}", e);
175  }
176  finally
177  {
178  updating = false;
179  }
180  }
181 
182  RunUpdate();
183  return true;
184  }
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:44
+
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:39
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:49
+
Task Restart()
Restarts the Host
+
bool updating
If a server update has been or is being applied
Definition: Server.cs:54
+
void CheckSanity(bool checkWatchdog)
Throws an InvalidOperationException if the IServerControl cannot be used
Definition: Server.cs:73
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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 73 of file Server.cs.

+
74  {
75  if (checkWatchdog && !WatchdogPresent)
76  throw new InvalidOperationException("Server restarts are not supported");
77 
78  if (cancellationTokenSource == null || logger == null)
79  throw new InvalidOperationException("Tried to control a non-running Server!");
80  }
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:44
+ +
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:49
+
+
+
+ +
+
+ + + + + + + + +
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 187 of file Server.cs.

+
188  {
189  if (handler == null)
190  throw new ArgumentNullException(nameof(handler));
191 
192  CheckSanity(false);
193 
194  lock (this)
195  if (!RestartRequested)
196  {
197  logger.LogTrace("Registering restart handler {0}...", handler);
198  restartHandlers.Add(handler);
199  return new RestartRegistration(() =>
200  {
201  lock (this)
202  if (!RestartRequested)
203  restartHandlers.Remove(handler);
204  });
205  }
206  return new RestartRegistration(() => { });
207  }
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:44
+
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:34
+ + +
void CheckSanity(bool checkWatchdog)
Throws an InvalidOperationException if the IServerControl cannot be used
Definition: Server.cs:73
+
+
+
+ +
+
+ + + + + + + +
Task Tgstation.Server.Host.Server.Restart ()
+
+ +

Restarts the Host

+ +

Implements Tgstation.Server.Host.Core.IServerControl.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Server.Restart (Version newVersion)
+
+private
+
+ +

Implements Restart()

+
Parameters
+ + +
newVersionThe Version of any potential updates being applied
+
+
+
Returns
+ +

Definition at line 217 of file Server.cs.

+
218  {
219  CheckSanity(true);
220 
221  logger.LogTrace("Begin Restart...");
222 
223  lock (this)
224  {
225  if ((updating && newVersion == null) || RestartRequested)
226  {
227  logger.LogTrace("Aborted due to concurrency conflict!");
228  return;
229  }
230  RestartRequested = true;
231  }
232 
233  logger.LogInformation("Restarting server...");
234 
235  using (var cts = new CancellationTokenSource())
236  {
237  logger.LogTrace("Running restart handlers...");
238  var cancellationToken = cts.Token;
239  var eventsTask = Task.WhenAll(restartHandlers.Select(x => x.HandleRestart(newVersion, cancellationToken)).ToList());
240  //YA GOT 10 SECONDS
241  var expiryTask = Task.Delay(TimeSpan.FromSeconds(10));
242  await Task.WhenAny(eventsTask, expiryTask).ConfigureAwait(false);
243  logger.LogTrace("Joining restart handlers...");
244  cts.Cancel();
245  try
246  {
247  await eventsTask.ConfigureAwait(false);
248  }
249  catch (OperationCanceledException) { }
250  catch (Exception e)
251  {
252  logger.LogError("Restart handlers error! Exception: {0}", e);
253  }
254  }
255 
256  logger.LogTrace("Stopping host...");
257  cancellationTokenSource.Cancel();
258  }
+
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:44
+
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:34
+ +
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:49
+
bool updating
If a server update has been or is being applied
Definition: Server.cs:54
+
void CheckSanity(bool checkWatchdog)
Throws an InvalidOperationException if the IServerControl cannot be used
Definition: Server.cs:73
+
+
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Server.RunAsync (CancellationToken cancellationToken)
+
+ +

Runs the IServer

+ +

Implements Tgstation.Server.Host.IServer.

+ +

Definition at line 83 of file Server.cs.

+
84  {
85  using (cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
86  using (var fsWatcher = updatePath != null ? new FileSystemWatcher(Path.GetDirectoryName(updatePath)) : null)
87  {
88  if (fsWatcher != null)
89  {
90  fsWatcher.Created += (a, b) =>
91  {
92  if (b.FullPath == updatePath && File.Exists(b.FullPath))
93  cancellationTokenSource.Cancel();
94  };
95  fsWatcher.EnableRaisingEvents = true;
96  }
97  using (var webHost = webHostBuilder
98  .UseStartup<Application>()
99  .ConfigureServices(serviceCollection => serviceCollection.AddSingleton<IServerControl>(this))
100  .Build()
101  )
102  {
103  logger = webHost.Services.GetRequiredService<ILogger<Server>>();
104  await webHost.RunAsync(cancellationTokenSource.Token).ConfigureAwait(false);
105  }
106  }
107  }
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:44
+ +
readonly string updatePath
The absolute path to install updates to
Definition: Server.cs:39
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:49
+
readonly IWebHostBuilder webHostBuilder
The IWebHostBuilder for the Server
Definition: Server.cs:29
+
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Server.cancellationTokenSource
+
+private
+
+ +

The cancellationTokenSource for the Server

+ +

Definition at line 49 of file Server.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ILogger<Server> Tgstation.Server.Host.Server.logger
+
+private
+
+ +

The ILogger for the Server

+ +

Definition at line 44 of file Server.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly List<IRestartHandler> Tgstation.Server.Host.Server.restartHandlers
+
+private
+
+ +

The IRestartHandlers to run when the Server restarts

+ +

Definition at line 34 of file Server.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Server.updatePath
+
+private
+
+ +

The absolute path to install updates to

+ +

Definition at line 39 of file Server.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Server.updating
+
+private
+
+ +

If a server update has been or is being applied

+ +

Definition at line 54 of file Server.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Host.Server.WatchdogPresent => updatePath != null
+
+ +

+ +

Definition at line 24 of file Server.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IWebHostBuilder Tgstation.Server.Host.Server.webHostBuilder
+
+private
+
+ +

The IWebHostBuilder for the Server

+ +

Definition at line 29 of file Server.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Server.RestartRequested
+
+getprivate set
+
+ +

+ +

Definition at line 21 of file Server.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_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..e00ff6796e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_server_factory-members.html @@ -0,0 +1,110 @@ + + + + + + +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..98f74a7c57 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_server_factory.html @@ -0,0 +1,167 @@ + + + + + + +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 7 of file ServerFactory.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
IServer Tgstation.Server.Host.ServerFactory.CreateServer (string[] args,
string updatePath 
)
+
+
+
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..4152cafa58 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program-members.html @@ -0,0 +1,118 @@ + + + + + + +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..d6416697f2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html @@ -0,0 +1,391 @@ + + + + + + +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 readonly IWatchdogFactory watchdogFactory = new WatchdogFactory()
 
+

Detailed Description

+

Contains the entrypoint for the application

+ +

Definition at line 21 of file Program.cs.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
static bool Tgstation.Server.Host.Service.Program.IsAdministrator ()
+
+staticprivate
+
+ +

Check if the running user is a system administrator

+
Returns
if the running user is a system administrator, otherwise
+ +

Definition at line 59 of file Program.cs.

+
60  {
61  var user = WindowsIdentity.GetCurrent();
62  var principal = new WindowsPrincipal(user);
63  return principal.IsInRole(WindowsBuiltInRole.Administrator);
64  }
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
static Task<int> Tgstation.Server.Host.Service.Program.Main (string[] args)
+
+staticprivate
+
+ +

Entrypoint for the application

+ +
+
+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Service.Program.OnExecuteAsync ()
+
+ +

Command line handler, always runs

+ +

Definition at line 69 of file Program.cs.

+ +

References Tgstation.Server.Host.Service.ServerService.Name.

+
70  {
71  if (Environment.UserInteractive)
72  {
73  if (!Install && !Uninstall && !Configure)
74  {
75  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);
76  if (result != DialogResult.Yes)
77  return;
78  Install = true;
79  Configure = true;
80  }
81 
82  if (!IsAdministrator())
83  {
84  //try to restart as admin
85  //its windows, first arg is .exe name guaranteed
86  var exe = Environment.GetCommandLineArgs().First();
87  var startInfo = new ProcessStartInfo
88  {
89  UseShellExecute = true,
90  Verb = "runas",
91  Arguments = String.Format(CultureInfo.InvariantCulture, "{0} {1}", Install ? "-i" : Uninstall ? "-u" : String.Empty, Configure ? "-c" : String.Empty),
92  FileName = exe,
93  WorkingDirectory = Environment.CurrentDirectory,
94  };
95  using (Process.Start(startInfo))
96  return;
97  }
98  }
99 
100  using (var loggerFactory = new LoggerFactory())
101  {
102  if (Configure)
103  await watchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty<string>(), default).ConfigureAwait(false);
104 
105  if (Install)
106  {
107  if (Uninstall)
108  //oh no, it's retarded...
109  return;
110  using (var processInstaller = new ServiceProcessInstaller())
111  using (var installer = new ServiceInstaller())
112  {
113  processInstaller.Account = ServiceAccount.LocalSystem;
114 
115  installer.Context = new InstallContext("tgs-4-install.log", new string[] { String.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", Assembly.GetEntryAssembly().Location) });
116  installer.Description = "/tg/station 13 server v4 running as a windows service";
117  installer.DisplayName = "/tg/station server 4";
118  installer.DelayedAutoStart = true;
119  installer.StartType = ServiceStartMode.Automatic;
120  installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" };
121  installer.ServiceName = ServerService.Name;
122  installer.Parent = processInstaller;
123 
124  var state = new ListDictionary();
125  installer.Install(state);
126  }
127  }
128  else if (Uninstall)
129  using (var installer = new ServiceInstaller())
130  {
131  installer.Context = new InstallContext("tgs-4-uninstall.log", null);
132  installer.ServiceName = ServerService.Name;
133  installer.Uninstall(null);
134  }
135  else if(!Configure)
136  ServiceBase.Run(new ServerService(watchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information));
137  }
138  }
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+
bool Uninstall
The –uninstall or -u option
Definition: Program.cs:27
+
static readonly IWatchdogFactory watchdogFactory
Definition: Program.cs:53
+
static bool IsAdministrator()
Check if the running user is a system administrator
Definition: Program.cs:59
+
bool Debug
The –debug or -d option. Enables debug logs
Definition: Program.cs:51
+
bool Configure
The –configure or -c option
Definition: Program.cs:39
+ +
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+
bool Install
The –install or -i option
Definition: Program.cs:33
+
bool Trace
The –trace or -t option. Enables trace logs
Definition: Program.cs:45
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IWatchdogFactory Tgstation.Server.Host.Service.Program.watchdogFactory = new WatchdogFactory()
+
+staticprivate
+
+ +

Definition at line 53 of file Program.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Configure
+
+getset
+
+ +

The –configure or -c option

+ +

Definition at line 39 of file Program.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Debug
+
+getset
+
+ +

The –debug or -d option. Enables debug logs

+ +

Definition at line 51 of file Program.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Install
+
+getset
+
+ +

The –install or -i option

+ +

Definition at line 33 of file Program.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Trace
+
+getset
+
+ +

The –trace or -t option. Enables trace logs

+ +

Definition at line 45 of file Program.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Uninstall
+
+get
+
+ +

The –uninstall or -u option

+ +

Definition at line 27 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_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..61c61e8179 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service-members.html @@ -0,0 +1,120 @@ + + + + + + +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..9e4782a072 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html @@ -0,0 +1,516 @@ + + + + + + +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 +IEventLog + +
+ + + + + + + +

+Public Member Functions

 ServerService (IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel)
 Construct a ServerService More...
 
void WriteEntry (string message, EventLogEntryType type, int eventID, short category)
 
+ + + + + + +

+Public Attributes

const string Name = "tgstation-server-4"
 The canonical windows service name More...
 
int MaxMessageSize => (int)EventLog.MaximumKilobytes * 1024
 
+ + + + + + + +

+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 18 of file ServerService.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 46 of file ServerService.cs.

+ +

References Tgstation.Server.Host.Watchdog.IWatchdogFactory.CreateWatchdog().

+
47  {
48  if (watchdogFactory == null)
49  throw new ArgumentNullException(nameof(watchdogFactory));
50  if (loggerFactory == null)
51  throw new ArgumentNullException(nameof(loggerFactory));
52 
53  loggerFactory.AddEventLog(new EventLogSettings
54  {
55  EventLog = this,
56  Filter = (message, logLevel) => logLevel >= minumumLogLevel
57  });
58 
59  ServiceName = Name;
60  watchdog = watchdogFactory.CreateWatchdog(loggerFactory);
61  }
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+
readonly IWatchdog watchdog
The IWatchdog for the ServerService
+
const string Name
The canonical windows service name
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Service.ServerService.Dispose (bool disposing)
+
+protected
+
+ +

+ +

Definition at line 96 of file ServerService.cs.

+ +

Referenced by Tgstation.Server.Host.Service.Tests.TestServerService.TestConstructionAndDisposal().

+
97  {
98  cancellationTokenSource?.Dispose();
99  base.Dispose(disposing);
100  }
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the ServerService
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Service.ServerService.OnStart (string[] args)
+
+protected
+
+ +

+ +

Definition at line 103 of file ServerService.cs.

+
104  {
105  cancellationTokenSource?.Dispose();
106  cancellationTokenSource = new CancellationTokenSource();
108  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + +
override void Tgstation.Server.Host.Service.ServerService.OnStop ()
+
+protected
+
+ +

+ +

Definition at line 111 of file ServerService.cs.

+
112  {
113  cancellationTokenSource.Cancel();
114  watchdogTask.GetAwaiter().GetResult();
115  }
Task watchdogTask
The Task recieved from IWatchdog.RunAsync(bool, string[], CancellationToken) of watchdog ...
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the ServerService
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
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 75 of file ServerService.cs.

+
76  {
77  await watchdog.RunAsync(false, args, cancellationTokenSource.Token).ConfigureAwait(false);
78 
79  void StopServiceAsync()
80  {
81  try
82  {
83  Task.Run(Stop, cancellationToken);
84  }
85  catch (OperationCanceledException) { }
86  catch (Exception e)
87  {
88  EventLog.WriteEntry(String.Format(CultureInfo.InvariantCulture, "Error stopping service! Exception: {0}", e));
89  }
90  }
91  StopServiceAsync();
92  }
+
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
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Service.ServerService.WriteEntry (string message,
EventLogEntryType type,
int eventID,
short category 
)
+
+ +

+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Service.ServerService.cancellationTokenSource
+
+private
+
+ +

The cancellationTokenSource for the ServerService

+ +

Definition at line 38 of file ServerService.cs.

+ +
+
+ +
+
+ + + + +
int Tgstation.Server.Host.Service.ServerService.MaxMessageSize => (int)EventLog.MaximumKilobytes * 1024
+
+ +

+ +

Definition at line 64 of file ServerService.cs.

+ +
+
+ +
+
+ + + + +
const string Tgstation.Server.Host.Service.ServerService.Name = "tgstation-server-4"
+
+ +

The canonical windows service name

+ +

Definition at line 23 of file ServerService.cs.

+ +

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync().

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Service.ServerService.watchdog
+
+private
+
+ +

The IWatchdog for the ServerService

+ +

Definition at line 28 of file ServerService.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Service.ServerService.watchdogTask
+
+private
+
+ +

The Task recieved from IWatchdog.RunAsync(bool, string[], CancellationToken) of watchdog

+ +

Definition at line 33 of file ServerService.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_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..d057904df9cb8fac6065afb11c5fe3528194562d GIT binary patch literal 1136 zcmeAS@N?(olHy`uVBq!ia0y~yU{V3H12~w0q#WbCJwQq#z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opJjhL%> zWn7=0zY4y#b^pA}%AWQocDJa=YB64Y>K*;bR54OMYr>Yrq5&q)Yd*ejPpN(Lt@UNg z6aIB7OS{%Cos#XoFJjy5Ew4gOPFyno(YL88kvH9+F*^lqoABtjp32+3m6AJ8ow(hy zN2U0^?QrUB)`WKJTA%pnKU8hYOSo0=dI7tVUxOdt#?-PtgZ{( zJ#oqE0uLD>Pp(1?va%&b=J-XM?Mf=Zz)oAw`oK($fjMON)*EaN9b2ausl8^nk*K?k zQ6NcoE6;0&6&uBFGjMDaTX5qo(}IIhIm`-2h$gh8FPr$L&04mS=>WqX@p%#q%omO- zG8!<%$_P=;Y}lSE(ROf+bOYmxjS{`tjw-jc@xI`XY`qp0cfd zfBon3LjP%{9t?aZlA@eLJs6~>eZC(o-S)&~uJQN%Az}v@j_%_=`S|Q?`!o6vK8Zc6 zKfn3(|EI6s9X}uZIrn_@s^C(OORXWc>w^D2da^@*I;+9n2|B{;&Kr$4ygkaR8C?19 z@)7aP8}4pwU84Cjb#ClY;m7lIUQb|nkOKanwzpd!l;b+*o z{J3rCHAO~?2L>vww@o(gov^0c`<2VigCWcL!Y1W*=)V&Ayw|kteSh_`HO@>02MRq7 zm2Iy6dTL$ZS*OtboG1U~zPp~e{KM?W`@oLB*Rmwa(ywL7tUt|Vo4GwVKl%Q8kIg&p zR7ReFH>DoWI&$_t*co*GeO%nB@0T~|U40o4ddu&rMNVj!;vuW6`lpQVOMQ2VY-f2e zBkaucRYkyHT5)s=FVlm~1wiJF&YRcb8u$+b9eW_@4U@tVEJO-8W)AHBATJtS@}fDa SDF#?PFnGH9xvX + + + + + +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..c0e4ab6b6d --- /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,164 @@ + + + + + + +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

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Service.Tests.TestServerService.TestConstructionAndDisposal ()
+
+ +

Definition at line 19 of file TestServerService.cs.

+ +

References Tgstation.Server.Host.Service.ServerService.Dispose().

+
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  }
+
+
+ +
+
+ + + + + + + +
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..08bc98e6e5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory-members.html @@ -0,0 +1,111 @@ + + + + + + +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..dc515eca96 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html @@ -0,0 +1,162 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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  }
+
+
+ +
+
+ + + + + + + +
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..31cc39a070 --- /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,110 @@ + + + + + + +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..9a38b8ec51 --- /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,139 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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..fc9dfc6935 --- /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,110 @@ + + + + + + +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..c72012ab24 --- /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,143 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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..3b151c1b91 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog-members.html @@ -0,0 +1,112 @@ + + + + + + +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.

+ + + + +
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..c0b3471861 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html @@ -0,0 +1,239 @@ + + + + + + +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 Attributes

readonly ILogger< Watchdoglogger
 The ILogger for the Watchdog More...
 
+

Detailed Description

+
+

Definition at line 16 of file Watchdog.cs.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Watchdog.Watchdog.Watchdog (ILogger< Watchdoglogger)
+
+ +

Construct a Watchdog

+
Parameters
+ + +
loggerThe value of logger
+
+
+ +

Definition at line 28 of file Watchdog.cs.

+
29  {
30  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
31  }
readonly ILogger< Watchdog > logger
The ILogger for the Watchdog
Definition: Watchdog.cs:22
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 34 of file Watchdog.cs.

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

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Watchdog> Tgstation.Server.Host.Watchdog.Watchdog.logger
+
+private
+
+ +

The ILogger for the Watchdog

+ +

Definition at line 22 of file Watchdog.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_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..e15030e29b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory-members.html @@ -0,0 +1,110 @@ + + + + + + +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..5bd3d5e8ae --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html @@ -0,0 +1,155 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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..4e0d82bb15 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html @@ -0,0 +1,233 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.AdministrationTest.Run (CancellationToken cancellationToken)
+
+ +

Definition at line 20 of file AdministrationTest.cs.

+ +

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

+
21  {
22  await TestRead(cancellationToken).ConfigureAwait(false);
23  }
async Task TestRead(CancellationToken cancellationToken)
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Tests.AdministrationTest.TestRead (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 25 of file AdministrationTest.cs.

+ +

References Tgstation.Server.Api.Models.Administration.LatestVersion, and Tgstation.Server.Api.Models.Administration.WindowsHost.

+
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
+ +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IAdministrationClient Tgstation.Server.Tests.AdministrationTest.client
+
+private
+
+ +

Definition at line 13 of file AdministrationTest.cs.

+ +
+
+
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..b944e114d5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test-members.html @@ -0,0 +1,115 @@ + + + + + + +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..19f5a7d9a7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html @@ -0,0 +1,295 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IByondClient Tgstation.Server.Tests.Instance.ByondTest.byondClient
+
+private
+
+ +

Definition at line 11 of file ByondTest.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IJobsClient Tgstation.Server.Tests.Instance.ByondTest.jobsClient
+
+private
+
+ +

Definition at line 12 of file ByondTest.cs.

+ +
+
+
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..85694b1812 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test-members.html @@ -0,0 +1,115 @@ + + + + + + +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..f5d56e4ce9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html @@ -0,0 +1,300 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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  }
+
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
bool Tgstation.Server.Tests.Instance.ConfigurationTest.FileExists (ConfigurationFile file)
+
+private
+
+ +

Definition at line 24 of file ConfigurationTest.cs.

+ +

References Tgstation.Server.Api.Models.ConfigurationFile.Path.

+
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
+
+
+
+ +
+
+ + + + + + + + +
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)
+
+
+
+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.ConfigurationTest.TestDeleteDirectory (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 31 of file ConfigurationTest.cs.

+ +

References Tgstation.Server.Api.Models.ConfigurationFile.Path.

+
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
+ +
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IConfigurationClient Tgstation.Server.Tests.Instance.ConfigurationTest.configurationClient
+
+private
+
+ +

Definition at line 15 of file ConfigurationTest.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Tests.Instance.ConfigurationTest.instance
+
+private
+
+ +

Definition at line 16 of file ConfigurationTest.cs.

+ +
+
+
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..63e56c5c69 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test-members.html @@ -0,0 +1,112 @@ + + + + + + +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..79fcb09e1c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html @@ -0,0 +1,197 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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  }
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.InstanceTest.RunTests (CancellationToken cancellationToken)
+
+ +

Definition at line 17 of file InstanceTest.cs.

+ +

Referenced by Tgstation.Server.Tests.InstanceManagerTest.Run().

+
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
+ +
IJobsClient Jobs
Access the IJobsClient
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceClient Tgstation.Server.Tests.Instance.InstanceTest.instanceClient
+
+private
+
+ +

Definition at line 10 of file InstanceTest.cs.

+ +
+
+
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..68280bf30e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test-members.html @@ -0,0 +1,115 @@ + + + + + + +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..398829a15e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html @@ -0,0 +1,298 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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  }
+ +
+
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
Task<Api.Models.Instance> Tgstation.Server.Tests.InstanceManagerTest.CreateTestInstance (CancellationToken cancellationToken)
+
+private
+
+ +
+
+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.InstanceManagerTest.Run (CancellationToken cancellationToken)
+
+ +

Definition at line 36 of file InstanceManagerTest.cs.

+ +

References Tgstation.Server.Tests.Instance.InstanceTest.RunTests().

+ +

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

+
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)
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Tests.InstanceManagerTest.counter
+
+private
+
+ +

Definition at line 19 of file InstanceManagerTest.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManagerClient Tgstation.Server.Tests.InstanceManagerTest.instanceManagerClient
+
+private
+
+ +

Definition at line 16 of file InstanceManagerTest.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Tests.InstanceManagerTest.testRootPath
+
+private
+
+ +

Definition at line 17 of file InstanceManagerTest.cs.

+ +
+
+
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..26ce3854c1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_integration_test-members.html @@ -0,0 +1,112 @@ + + + + + + +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..9d2231e88d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html @@ -0,0 +1,219 @@ + + + + + + +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

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Tests.IntegrationTest.TestStandardOperation ()
+
+ +

Definition at line 99 of file IntegrationTest.cs.

+ +

References Tgstation.Server.Client.IServerClient.Administration, Tgstation.Server.Api.Models.User.AdminName, Tgstation.Server.Api.Models.Token.Bearer, 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.

+
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  }
DateTimeOffset ExpiresAt
When the Token expires
Definition: Token.cs:18
+
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
+
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
+
+
+
+ +
+
+ + + + + + + +
async Task Tgstation.Server.Tests.IntegrationTest.TestUpdate ()
+
+ +

Definition at line 24 of file IntegrationTest.cs.

+ +

References Tgstation.Server.Client.IServerClient.Administration, Tgstation.Server.Api.Models.User.AdminName, Tgstation.Server.Api.Models.User.DefaultAdminPassword, and Tgstation.Server.Client.IAdministrationClient.Update().

+
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
+ +
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
+
+
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
readonly IServerClientFactory Tgstation.Server.Tests.IntegrationTest.clientFactory = new ServerClientFactory(new ProductHeaderValue(Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString()))
+
+private
+
+ +

Definition at line 20 of file IntegrationTest.cs.

+ +
+
+
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..81d6ec68af --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_testing_server-members.html @@ -0,0 +1,116 @@ + + + + + + +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..908b0ece27 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html @@ -0,0 +1,316 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Tgstation.Server.Tests.TestingServer.TestingServer (string updatePath)
+
+ +

Definition at line 22 of file TestingServer.cs.

+ +

References Tgstation.Server.Host.ServerFactory.CreateServer().

+
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
+ +
+
+
+

Member Function Documentation

+ +
+
+ + + + + + + +
void Tgstation.Server.Tests.TestingServer.Dispose ()
+
+ +

Definition at line 59 of file TestingServer.cs.

+
60  {
61  System.IO.Directory.Delete(Directory, true);
62  }
+ +
+
+
+ +
+
+ + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
readonly IServer Tgstation.Server.Tests.TestingServer.realServer
+
+private
+
+ +

Definition at line 20 of file TestingServer.cs.

+ +
+
+ +
+
+ + + + +
bool Tgstation.Server.Tests.TestingServer.RestartRequested => realServer.RestartRequested
+
+ +

Definition at line 18 of file TestingServer.cs.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Tests.TestingServer.Directory
+
+get
+
+ +

Definition at line 17 of file TestingServer.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Tests.TestingServer.Url
+
+get
+
+ +

Definition at line 15 of file TestingServer.cs.

+ +
+
+
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..79db04d04b --- /dev/null +++ b/classes.html @@ -0,0 +1,209 @@ + + + + + + +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  
+
DreamDaemon (Tgstation.Server.Api.Models)   IInstanceManager (Tgstation.Server.Host.Components)   MethodNotSupportedException (Tgstation.Server.Client)   SqlServerDatabaseContextModelSnapshot (Tgstation.Server.Host.Models.Migrations)   
DreamDaemonClient (Tgstation.Server.Client.Components)   IInstanceManagerClient (Tgstation.Server.Client)   Migration   SqlServerDesignTimeDbContextFactory (Tgstation.Server.Host.Models.Migrations)   
Administration (Tgstation.Server.Api.Models)   DreamDaemonController (Tgstation.Server.Host.Controllers)   IInstanceUserClient (Tgstation.Server.Client.Components)   TestApplication.MockApplicationLifetime (Tgstation.Server.Host.Core.Tests)   SynchronousIOManager (Tgstation.Server.Host.IO)   
AdministrationClient (Tgstation.Server.Client)   DreamDaemonLaunchParameters (Tgstation.Server.Api.Models.Internal)   IIOManager (Tgstation.Server.Host.IO)   TestApplication.MockSetupWizard (Tgstation.Server.Host.Core.Tests)   
  T  
+
AdministrationController (Tgstation.Server.Host.Controllers)   DreamDaemonSettings (Tgstation.Server.Api.Models.Internal)   IJobManager (Tgstation.Server.Host.Core)   ModelController (Tgstation.Server.Host.Controllers)   
AdministrationTest (Tgstation.Server.Tests)   DreamDaemonSettings (Tgstation.Server.Host.Models)   IJobsClient (Tgstation.Server.Client.Components)   ModelSnapshot   TemporaryDmbProvider (Tgstation.Server.Host.Components.Compiler)   
ApiClient (Tgstation.Server.Client)   DreamMaker (Tgstation.Server.Api.Models)   IJsonTrackingContext (Tgstation.Server.Host.Components.Chat)   MonitorState (Tgstation.Server.Host.Components.Watchdog)   TestApiClient (Tgstation.Server.Client.Tests)   
ApiClientFactory (Tgstation.Server.Client)   DreamMaker (Tgstation.Server.Host.Components.Compiler)   INetworkPromptReaper (Tgstation.Server.Host.Components.Watchdog)   MSAddMinimumSecurity (Tgstation.Server.Host.Models.Migrations)   TestApiHeaders (Tgstation.Server.Api.Tests)   
ApiConflictException (Tgstation.Server.Client)   DreamMakerClient (Tgstation.Server.Client.Components)   Instance (Tgstation.Server.Host.Components)   MSInitialCreate (Tgstation.Server.Host.Models.Migrations)   TestApplication (Tgstation.Server.Host.Core.Tests)   
ApiController (Tgstation.Server.Host.Controllers)   DreamMakerController (Tgstation.Server.Host.Controllers)   Instance (Tgstation.Server.Api.Models)   MSNullableAndForeignKeyCleanup (Tgstation.Server.Host.Models.Migrations)   TestAsyncDelayer (Tgstation.Server.Host.Core.Tests)   
ApiHeaders (Tgstation.Server.Api)   DreamMakerSettings (Tgstation.Server.Host.Models)   Instance (Tgstation.Server.Host.Models)   MSReattachCompileJobRequired (Tgstation.Server.Host.Models.Migrations)   TestAuthenticationContext (Tgstation.Server.Host.Security.Tests)   
ApiMismatchException (Tgstation.Server.Client)   
  E  
+
InstanceClient (Tgstation.Server.Client.Components)   MYAddMinimumSecurity (Tgstation.Server.Host.Models.Migrations)   TestConsole (Tgstation.Server.Host.IO.Tests)   
Application (Tgstation.Server.Host.Core)   InstanceController (Tgstation.Server.Host.Controllers)   MYInitialCreate (Tgstation.Server.Host.Models.Migrations)   TestDatabaseContextFactory (Tgstation.Server.Host.Core.Tests)   
ApplicationBuilderExtensions (Tgstation.Server.Host.Core)   ErrorMessage (Tgstation.Server.Api.Models)   InstanceFactory (Tgstation.Server.Host.Components)   MYNullableAndForeignKeyCleanup (Tgstation.Server.Host.Models.Migrations)   TestDBConnectionFactory (Tgstation.Server.Host.Core.Tests)   
AsyncDelayer (Tgstation.Server.Host.Core)   EventConsumer (Tgstation.Server.Host.Components)   InstanceManager (Tgstation.Server.Host.Components)   MYReattachCompileJobRequired (Tgstation.Server.Host.Models.Migrations)   TestDiscordProvider (Tgstation.Server.Host.Components.Chat.Providers.Tests)   
AuthenticationContext (Tgstation.Server.Host.Security)   EventNotification (Tgstation.Server.Host.Components.Interop)   InstanceManagerClient (Tgstation.Server.Client)   MySqlDatabaseContext (Tgstation.Server.Host.Models)   TestDreamDaemonClient (Tgstation.Server.Client.Components.Tests)   
AuthenticationContextFactory (Tgstation.Server.Host.Security)   Exception   InstanceManagerTest (Tgstation.Server.Tests)   MySqlDatabaseContextModelSnapshot (Tgstation.Server.Host.Models.Migrations)   TestGitHubClientFactory (Tgstation.Server.Host.Core.Tests)   
AuthorizeAttribute   
  F  
+
InstanceTest (Tgstation.Server.Tests.Instance)   MySqlDesignTimeDbContextFactory (Tgstation.Server.Host.Models.Migrations)   TestingServer (Tgstation.Server.Tests)   
AutoGeneratedProgram   InstanceUser (Tgstation.Server.Api.Models)   
  N  
+
TestIrcConnectionStringBuilder (Tgstation.Server.Api.Models.Tests)   
  B  
+
FileLoggingConfiguration (Tgstation.Server.Host.Configuration)   InstanceUser (Tgstation.Server.Host.Models)   TestJobException (Tgstation.Server.Host.Core.Tests)   
  G  
+
InstanceUserClient (Tgstation.Server.Client.Components)   NativeMethods (Tgstation.Server.Host)   TestJobHandler (Tgstation.Server.Host.Core.Tests)   
BoolConverter (Tgstation.Server.Host.Components.Chat.Commands)   InstanceUserController (Tgstation.Server.Host.Controllers)   
  P  
+
TestMerge (Tgstation.Server.Host.Components.Interop)   
Byond (Tgstation.Server.Api.Models)   GeneralConfiguration (Tgstation.Server.Host.Configuration)   InsufficientPermissionsException (Tgstation.Server.Client)   TestMerge (Tgstation.Server.Host.Models)   
ByondClient (Tgstation.Server.Client.Components)   GitHubClientFactory (Tgstation.Server.Host.Core)   IntegrationTest (Tgstation.Server.Tests)   PlatformIdentifier (Tgstation.Server.Host.Core)   TestMerge (Tgstation.Server.Api.Models.Internal)   
ByondCommand (Tgstation.Server.Host.Components.Chat.Commands)   
  H  
+
IPlatformIdentifier (Tgstation.Server.Host.Core)   PosixByondInstaller (Tgstation.Server.Host.Components.Byond)   TestMerge (Tgstation.Server.Api.Models)   
ByondController (Tgstation.Server.Host.Controllers)   IPostWriteHandler (Tgstation.Server.Host.IO)   PosixNetworkPromptReaper (Tgstation.Server.Host.Components.Watchdog)   TestMergeBase (Tgstation.Server.Api.Models.Internal)   
ByondExecutableLock (Tgstation.Server.Host.Components.Byond)   HomeController (Tgstation.Server.Host.Controllers)   IProcess (Tgstation.Server.Host.Core)   PosixPostWriteHandler (Tgstation.Server.Host.IO)   TestMergeParameters (Tgstation.Server.Api.Models)   
ByondManager (Tgstation.Server.Host.Components.Byond)   HttpClient (Tgstation.Server.Client)   IProcessBase (Tgstation.Server.Host.Core)   PosixSymlinkFactory (Tgstation.Server.Host.IO)   TestPlatformIdentifier (Tgstation.Server.Host.Core.Tests)   
ByondTest (Tgstation.Server.Tests.Instance)   
  I  
+
IProcessExecutor (Tgstation.Server.Host.Core)   PosixSystemIdentityFactory (Tgstation.Server.Host.Security)   TestPosixByondInstaller (Tgstation.Server.Host.Components.Byond.Tests)   
  C  
+
IProvider (Tgstation.Server.Host.Components.Chat.Providers)   Process (Tgstation.Server.Host.Core)   TestPostWriteHandler (Tgstation.Server.Host.IO.Tests)   
IAdministrationClient (Tgstation.Server.Client)   IProviderFactory (Tgstation.Server.Host.Components.Chat)   ProcessExecutor (Tgstation.Server.Host.Core)   TestProgram (Tgstation.Server.Host.Console.Tests)   
Channel (Tgstation.Server.Host.Components.Chat)   IApiClient (Tgstation.Server.Client)   IrcConnectionStringBuilder (Tgstation.Server.Api.Models)   Program (Tgstation.Server.Host)   TestRights (Tgstation.Server.Api.Rights.Tests)   
ChannelMapping (Tgstation.Server.Host.Components.Chat)   IApiClientFactory (Tgstation.Server.Client)   IrcProvider (Tgstation.Server.Host.Components.Chat.Providers)   Program (Tgstation.Server.Host.Console)   TestServerClientFactory (Tgstation.Server.Client.Tests)   
Chat (Tgstation.Server.Host.Components.Chat)   IApplication (Tgstation.Server.Host.Core)   IReattachInfoHandler (Tgstation.Server.Host.Components.Watchdog)   Program (Tgstation.Server.Host.Service)   TestServerFactory (Tgstation.Server.Host.Tests)   
ChatBot (Tgstation.Server.Api.Models)   IApplicationLifetime   IRepository (Tgstation.Server.Host.Components.Repository)   Provider (Tgstation.Server.Host.Components.Chat.Providers)   TestServerService (Tgstation.Server.Host.Service.Tests)   
ChatBot (Tgstation.Server.Api.Models.Internal)   IAsyncDelayer (Tgstation.Server.Host.Core)   IRepositoryClient (Tgstation.Server.Client.Components)   ProviderFactory (Tgstation.Server.Host.Components.Chat)   TestSetupWizard (Tgstation.Server.Host.Core.Tests)   
ChatBot (Tgstation.Server.Host.Models)   IAuthenticationContext (Tgstation.Server.Host.Security)   IRepositoryManager (Tgstation.Server.Host.Components.Repository)   PullRequestsCommand (Tgstation.Server.Host.Components.Chat.Commands)   TestSymlinkFactory (Tgstation.Server.Host.IO.Tests)   
ChatBotsClient (Tgstation.Server.Client.Components)   IAuthenticationContextFactory (Tgstation.Server.Host.Security)   IRequestLogger (Tgstation.Server.Client)   
  R  
+
TestWatchdog (Tgstation.Server.Host.Watchdog.Tests)   
ChatChannel (Tgstation.Server.Api.Models)   IByondClient (Tgstation.Server.Client.Components)   IRestartHandler (Tgstation.Server.Host.Core)   TestWatchdog (Tgstation.Server.Host.Components.Watchdog.Tests)   
ChatChannel (Tgstation.Server.Host.Models)   IByondExecutableLock (Tgstation.Server.Host.Components.Byond)   IRestartRegistration (Tgstation.Server.Host.Core)   RateLimitException (Tgstation.Server.Client)   TestWatchdogFactory (Tgstation.Server.Host.Watchdog.Tests)   
ChatCommand (Tgstation.Server.Host.Components.Interop)   IByondInstaller (Tgstation.Server.Host.Components.Byond)   IServer (Tgstation.Server.Host)   ReattachInfoHandler (Tgstation.Server.Host.Components)   TgsAuthorizeAttribute (Tgstation.Server.Host.Controllers)   
ChatConnectionStringBuilder (Tgstation.Server.Api.Models.Internal)   IByondManager (Tgstation.Server.Host.Components.Byond)   IServerClient (Tgstation.Server.Client)   ReattachInformation (Tgstation.Server.Host.Components.Watchdog)   Token (Tgstation.Server.Api.Models)   
ChatController (Tgstation.Server.Host.Controllers)   IChat (Tgstation.Server.Host.Components.Chat)   IServerClientFactory (Tgstation.Server.Client)   ReattachInformation (Tgstation.Server.Host.Models)   TokenFactory (Tgstation.Server.Host.Security)   
ChatFactory (Tgstation.Server.Host.Components.Chat)   IChatBotsClient (Tgstation.Server.Client.Components)   IServerControl (Tgstation.Server.Host.Core)   ReattachInformationBase (Tgstation.Server.Host.Models)   
  U  
+
ClaimsInjector (Tgstation.Server.Host.Security)   IChatFactory (Tgstation.Server.Host.Components.Chat)   IServerFactory (Tgstation.Server.Host)   Repository (Tgstation.Server.Host.Components.Repository)   
ClientException (Tgstation.Server.Client)   IClaimsInjector (Tgstation.Server.Host.Security)   ISessionController (Tgstation.Server.Host.Components.Watchdog)   Repository (Tgstation.Server.Api.Models)   UnauthorizedException (Tgstation.Server.Client)   
CommandFactory (Tgstation.Server.Host.Components.Chat.Commands)   ICommand (Tgstation.Server.Host.Components.Chat.Commands)   ISessionControllerFactory (Tgstation.Server.Host.Components.Watchdog)   RepositoryClient (Tgstation.Server.Client.Components)   UnrecognizedResponseException (Tgstation.Server.Client)   
CommCommand (Tgstation.Server.Host.Components.Interop)   ICommandFactory (Tgstation.Server.Host.Components.Chat.Commands)   ISetupWizard (Tgstation.Server.Host.Core)   RepositoryController (Tgstation.Server.Host.Controllers)   UpdatesConfiguration (Tgstation.Server.Host.Configuration)   
CommContext (Tgstation.Server.Host.Components.Interop)   ICommContext (Tgstation.Server.Host.Components.Interop)   ISymlinkFactory (Tgstation.Server.Host.IO)   RepositoryManager (Tgstation.Server.Host.Components.Repository)   User (Tgstation.Server.Api.Models)   
CompileJob (Tgstation.Server.Api.Models.Internal)   ICommHandler (Tgstation.Server.Host.Components.Interop)   ISynchronousIOManager (Tgstation.Server.Host.IO)   RepositorySettings (Tgstation.Server.Api.Models.Internal)   User (Tgstation.Server.Host.Models)   
CompileJob (Tgstation.Server.Api.Models)   ICompileJobConsumer (Tgstation.Server.Host.Components.Compiler)   ISystemIdentity (Tgstation.Server.Host.Security)   RepositorySettings (Tgstation.Server.Host.Models)   User (Tgstation.Server.Api.Models.Internal)   
CompileJob (Tgstation.Server.Host.Models)   IConfiguration (Tgstation.Server.Host.Components.StaticFiles)   ISystemIdentityFactory (Tgstation.Server.Host.Security)   RequestTimeoutException (Tgstation.Server.Client)   User (Tgstation.Server.Host.Components.Chat)   
Configuration (Tgstation.Server.Host.Components.StaticFiles)   IConfigurationClient (Tgstation.Server.Client.Components)   ITokenFactory (Tgstation.Server.Host.Security)   ResolvingIOManager (Tgstation.Server.Host.IO)   UserController (Tgstation.Server.Host.Controllers)   
ConfigurationClient (Tgstation.Server.Client.Components)   IConsole (Tgstation.Server.Host.IO)   IUsersClient (Tgstation.Server.Client)   Response (Tgstation.Server.Host.Components.Chat)   UsersClient (Tgstation.Server.Client)   
ConfigurationController (Tgstation.Server.Host.Controllers)   ICredentialsProvider (Tgstation.Server.Host.Components.Repository)   IWatchdog (Tgstation.Server.Host.Watchdog)   RestartRegistration (Tgstation.Server.Host.Core)   UserUpdate (Tgstation.Server.Api.Models)   
ConfigurationFile (Tgstation.Server.Api.Models)   ICryptographySuite (Tgstation.Server.Host.Security)   IWatchdog (Tgstation.Server.Host.Components.Watchdog)   RevInfoTestMerge (Tgstation.Server.Host.Models)   
  V  
+
ConfigurationTest (Tgstation.Server.Tests.Instance)   ICustomCommandHandler (Tgstation.Server.Host.Components.Chat)   IWatchdogFactory (Tgstation.Server.Host.Components.Watchdog)   RevisionCommand (Tgstation.Server.Host.Components.Chat.Commands)   
ConflictException (Tgstation.Server.Client)   IDatabaseContext (Tgstation.Server.Host.Models)   IWatchdogFactory (Tgstation.Server.Host.Watchdog)   RevisionInformation (Tgstation.Server.Host.Models)   VersionCommand (Tgstation.Server.Host.Components.Chat.Commands)   
Console (Tgstation.Server.Host.IO)   IDatabaseContextFactory (Tgstation.Server.Host.Core)   
  J  
+
RevisionInformation (Tgstation.Server.Api.Models.Internal)   
  W  
+
Constants (Tgstation.Server.Host.Components.Interop)   IDatabaseSeeder (Tgstation.Server.Host.Models)   RevisionInformation (Tgstation.Server.Api.Models)   
Controller   IDBConnectionFactory (Tgstation.Server.Host.Core)   Job (Tgstation.Server.Api.Models)   RightsHelper (Tgstation.Server.Api.Rights)   Watchdog (Tgstation.Server.Host.Components.Watchdog)   
CredentialsProvider (Tgstation.Server.Host.Components.Repository)   IdentityCache (Tgstation.Server.Host.Security)   Job (Tgstation.Server.Api.Models.Internal)   Routes (Tgstation.Server.Api)   Watchdog (Tgstation.Server.Host.Watchdog)   
CryptographySuite (Tgstation.Server.Host.Security)   IdentityCacheObject (Tgstation.Server.Host.Security)   Job (Tgstation.Server.Host.Models)   
  S  
+
WatchdogFactory (Tgstation.Server.Host.Components.Watchdog)   
CustomCommand (Tgstation.Server.Host.Components.Chat.Commands)   IDesignTimeDbContextFactory   JobController (Tgstation.Server.Host.Controllers)   WatchdogFactory (Tgstation.Server.Host.Watchdog)   
  D  
+
IDisposable   JobException (Tgstation.Server.Host.Core)   SemaphoreSlimContext (Tgstation.Server.Host.Core)   WatchdogReattachInformation (Tgstation.Server.Host.Models)   
IDmbFactory (Tgstation.Server.Host.Components.Compiler)   JobHandler (Tgstation.Server.Host.Core)   Server (Tgstation.Server.Host)   WatchdogReattachInformation (Tgstation.Server.Host.Components.Watchdog)   
DatabaseConfiguration (Tgstation.Server.Host.Configuration)   IDmbProvider (Tgstation.Server.Host.Components)   JobManager (Tgstation.Server.Host.Core)   ServerClient (Tgstation.Server.Client)   WatchdogReattachInformationBase (Tgstation.Server.Host.Models)   
DatabaseContext (Tgstation.Server.Host.Models)   IDreamDaemonClient (Tgstation.Server.Client.Components)   JobsClient (Tgstation.Server.Client.Components)   ServerClientFactory (Tgstation.Server.Client)   WindowsByondInstaller (Tgstation.Server.Host.Components.Byond)   
DatabaseContextFactory (Tgstation.Server.Host.Core)   IDreamMaker (Tgstation.Server.Host.Components.Compiler)   JsonConverter   ServerErrorException (Tgstation.Server.Client)   WindowsNetworkPromptReaper (Tgstation.Server.Host.Components.Watchdog)   
DatabaseSeeder (Tgstation.Server.Host.Models)   IDreamMakerClient (Tgstation.Server.Client.Components)   JsonFile (Tgstation.Server.Host.Components.Interop)   ServerFactory (Tgstation.Server.Host)   WindowsPostWriteHandler (Tgstation.Server.Host.IO)   
DBConnectionFactory (Tgstation.Server.Host.Core)   IEventConsumer (Tgstation.Server.Host.Components)   JsonSubFileList (Tgstation.Server.Host.Components.Interop)   ServerInformation (Tgstation.Server.Api.Models)   WindowsSymlinkFactory (Tgstation.Server.Host.IO)   
DbContext   IEventLog   JsonTrackingContext (Tgstation.Server.Host.Components.Chat)   ServerService (Tgstation.Server.Host.Service)   WindowsSystemIdentity (Tgstation.Server.Host.Security)   
DeadSessionController (Tgstation.Server.Host.Components.Watchdog)   IGitHubClientFactory (Tgstation.Server.Host.Core)   
  K  
+
ServerSideModifications (Tgstation.Server.Host.Components.StaticFiles)   WindowsSystemIdentityFactory (Tgstation.Server.Host.Security)   
DefaultIOManager (Tgstation.Server.Host.IO)   IHostedService   ServiceBase   
DesignTimeDbContextFactoryHelpers (Tgstation.Server.Host.Models.Migrations)   IHttpClient (Tgstation.Server.Client)   KekCommand (Tgstation.Server.Host.Components.Chat.Commands)   ServiceUnavailableException (Tgstation.Server.Client)   
DiscordConnectionStringBuilder (Tgstation.Server.Api.Models)   IIdentityCache (Tgstation.Server.Host.Security)   
  L  
+
SessionController (Tgstation.Server.Host.Components.Watchdog)   
DiscordProvider (Tgstation.Server.Host.Components.Chat.Providers)   IInstance (Tgstation.Server.Host.Components)   SessionControllerFactory (Tgstation.Server.Host.Components.Watchdog)   
DmbFactory (Tgstation.Server.Host.Components.Compiler)   IInstanceClient (Tgstation.Server.Client.Components)   LaunchResult (Tgstation.Server.Host.Components.Watchdog)   SetupWizard (Tgstation.Server.Host.Core)   
DmbProvider (Tgstation.Server.Host.Components.Compiler)   IInstanceFactory (Tgstation.Server.Host.Components)   
  M  
+
SqlServerDatabaseContext (Tgstation.Server.Host.Models)   
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_02f69155ced6ccca99a24744a5273903.html b/dir_02f69155ced6ccca99a24744a5273903.html new file mode 100644 index 0000000000..6f22faebc2 --- /dev/null +++ b/dir_02f69155ced6ccca99a24744a5273903.html @@ -0,0 +1,149 @@ + + + + + + +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..d2c2578eaf --- /dev/null +++ b/dir_08963d262fa9e27215dce7b7c6e97f1b.html @@ -0,0 +1,119 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Configuration Directory Reference
+
+ + + + + diff --git a/dir_0c9add60ab05c04ed8367ecaedf67c01.html b/dir_0c9add60ab05c04ed8367ecaedf67c01.html new file mode 100644 index 0000000000..d168fb6958 --- /dev/null +++ b/dir_0c9add60ab05c04ed8367ecaedf67c01.html @@ -0,0 +1,149 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Migrations Directory Reference
+
+ + + + + diff --git a/dir_0de875c2ee7edd4009e892c5045f7b3a.html b/dir_0de875c2ee7edd4009e892c5045f7b3a.html new file mode 100644 index 0000000000..d7609934bf --- /dev/null +++ b/dir_0de875c2ee7edd4009e892c5045f7b3a.html @@ -0,0 +1,165 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Core Directory Reference
+
+ + + + + diff --git a/dir_0e792d76844bf2d7c79795a56a50ebec.html b/dir_0e792d76844bf2d7c79795a56a50ebec.html new file mode 100644 index 0000000000..23a89b0749 --- /dev/null +++ b/dir_0e792d76844bf2d7c79795a56a50ebec.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_0f5073360b9ba6d1522457c65eebe36a.html b/dir_0f5073360b9ba6d1522457c65eebe36a.html new file mode 100644 index 0000000000..d74e7eaf9f --- /dev/null +++ b/dir_0f5073360b9ba6d1522457c65eebe36a.html @@ -0,0 +1,127 @@ + + + + + + +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..aa10758ae0 --- /dev/null +++ b/dir_103b33cf1ab7043de6f87dfa61afa23f.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_1302441b003a340c6a16c9bc1b51c94e.html b/dir_1302441b003a340c6a16c9bc1b51c94e.html new file mode 100644 index 0000000000..80536a8f46 --- /dev/null +++ b/dir_1302441b003a340c6a16c9bc1b51c94e.html @@ -0,0 +1,125 @@ + + + + + + +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_13bee0ed20ecc83b9bcd4b869b726d42.html b/dir_13bee0ed20ecc83b9bcd4b869b726d42.html new file mode 100644 index 0000000000..22a0a8b491 --- /dev/null +++ b/dir_13bee0ed20ecc83b9bcd4b869b726d42.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release/netstandard2.0 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netstandard2.0 Directory Reference
+
+ + + + + diff --git a/dir_177c182c6d1f29bec543c3fdad3072d5.html b/dir_177c182c6d1f29bec543c3fdad3072d5.html new file mode 100644 index 0000000000..c5f1f80c35 --- /dev/null +++ b/dir_177c182c6d1f29bec543c3fdad3072d5.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_18a5e30c14613227f95d12bd9fddc614.html b/dir_18a5e30c14613227f95d12bd9fddc614.html new file mode 100644 index 0000000000..2d245f3bd5 --- /dev/null +++ b/dir_18a5e30c14613227f95d12bd9fddc614.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_1cebbc1bce26b60bfb2ee26c80f86b02.html b/dir_1cebbc1bce26b60bfb2ee26c80f86b02.html new file mode 100644 index 0000000000..89fa3f5688 --- /dev/null +++ b/dir_1cebbc1bce26b60bfb2ee26c80f86b02.html @@ -0,0 +1,109 @@ + + + + + + +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..fd037e722b --- /dev/null +++ b/dir_2133157f8312226ef9ea4ce42a802cf8.html @@ -0,0 +1,113 @@ + + + + + + +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_298f2a364723f4f4cea115538f944a94.html b/dir_298f2a364723f4f4cea115538f944a94.html new file mode 100644 index 0000000000..38023d24fb --- /dev/null +++ b/dir_298f2a364723f4f4cea115538f944a94.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_2ea2465064f3ff030c6dd6700a328d91.html b/dir_2ea2465064f3ff030c6dd6700a328d91.html new file mode 100644 index 0000000000..649b91cc6b --- /dev/null +++ b/dir_2ea2465064f3ff030c6dd6700a328d91.html @@ -0,0 +1,120 @@ + + + + + + +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..95e1a45a39 --- /dev/null +++ b/dir_34761767c1c3cd212f9d2f80ea0828a8.html @@ -0,0 +1,140 @@ + + + + + + +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_383ca23c40357ede4cca827b4a365c76.html b/dir_383ca23c40357ede4cca827b4a365c76.html new file mode 100644 index 0000000000..f0da92e2cc --- /dev/null +++ b/dir_383ca23c40357ede4cca827b4a365c76.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Release/netstandard2.0 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netstandard2.0 Directory Reference
+
+ + + + + diff --git a/dir_38cec1532eaed7aa1de0b599a76e3e80.html b/dir_38cec1532eaed7aa1de0b599a76e3e80.html new file mode 100644 index 0000000000..3734c1c544 --- /dev/null +++ b/dir_38cec1532eaed7aa1de0b599a76e3e80.html @@ -0,0 +1,137 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Controllers Directory Reference
+
+ + + + + diff --git a/dir_40138fd4849573e743490d583f6d06d6.html b/dir_40138fd4849573e743490d583f6d06d6.html new file mode 100644 index 0000000000..bcd2178ae4 --- /dev/null +++ b/dir_40138fd4849573e743490d583f6d06d6.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_4122b363a9d577bed19bef337e757ff3.html b/dir_4122b363a9d577bed19bef337e757ff3.html new file mode 100644 index 0000000000..b3a9b1e4ea --- /dev/null +++ b/dir_4122b363a9d577bed19bef337e757ff3.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netstandard2.0
 
+
+ + + + diff --git a/dir_446bdfc1cd19b69c11765b5665ebfd45.html b/dir_446bdfc1cd19b69c11765b5665ebfd45.html new file mode 100644 index 0000000000..e9184ffb05 --- /dev/null +++ b/dir_446bdfc1cd19b69c11765b5665ebfd45.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_4ddbd20a555bd1f3bf9569744c8989cc.html b/dir_4ddbd20a555bd1f3bf9569744c8989cc.html new file mode 100644 index 0000000000..f29416300e --- /dev/null +++ b/dir_4ddbd20a555bd1f3bf9569744c8989cc.html @@ -0,0 +1,113 @@ + + + + + + +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_53aae571c66a052729f8e64ccc397130.html b/dir_53aae571c66a052729f8e64ccc397130.html new file mode 100644 index 0000000000..41068033a6 --- /dev/null +++ b/dir_53aae571c66a052729f8e64ccc397130.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_53c056aa6a96f034cca75f793964be6e.html b/dir_53c056aa6a96f034cca75f793964be6e.html new file mode 100644 index 0000000000..221965305a --- /dev/null +++ b/dir_53c056aa6a96f034cca75f793964be6e.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_59425e443f801f1f2fd8bbe4959a3ccf.html b/dir_59425e443f801f1f2fd8bbe4959a3ccf.html new file mode 100644 index 0000000000..837d4508e9 --- /dev/null +++ b/dir_59425e443f801f1f2fd8bbe4959a3ccf.html @@ -0,0 +1,121 @@ + + + + + + +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..4127709c2b --- /dev/null +++ b/dir_5d46d0c3fd1cac5ce1ea23751ad25792.html @@ -0,0 +1,119 @@ + + + + + + +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..cafa89e051 --- /dev/null +++ b/dir_5d5b300b88421e3050db28dd037f6f39.html @@ -0,0 +1,116 @@ + + + + + + +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..6a9180c00b --- /dev/null +++ b/dir_5e0b464d3b4be546c63c5188ffeb96e4.html @@ -0,0 +1,115 @@ + + + + + + +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..a47941bde3 --- /dev/null +++ b/dir_61d7974a657c30011f457b376d274ee7.html @@ -0,0 +1,166 @@ + + + + + + +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..91f172fc1b --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,119 @@ + + + + + + +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..218f75929a --- /dev/null +++ b/dir_685b5aa2d8a661ab5bc3f68b331887b0.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_689f0584ee97ae9ca308532531d9c5d2.html b/dir_689f0584ee97ae9ca308532531d9c5d2.html new file mode 100644 index 0000000000..6c9954610a --- /dev/null +++ b/dir_689f0584ee97ae9ca308532531d9c5d2.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_6c60df807dd2523776d391746c262b4d.html b/dir_6c60df807dd2523776d391746c262b4d.html new file mode 100644 index 0000000000..76adc6f8d6 --- /dev/null +++ b/dir_6c60df807dd2523776d391746c262b4d.html @@ -0,0 +1,143 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Components Directory Reference
+
+ + + + + diff --git a/dir_6c8d8f20501e8e412458f542d0998195.html b/dir_6c8d8f20501e8e412458f542d0998195.html new file mode 100644 index 0000000000..0a0cbe414e --- /dev/null +++ b/dir_6c8d8f20501e8e412458f542d0998195.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netstandard2.0
 
+
+ + + + diff --git a/dir_6db5af7fcfa17a34c7abf23e195af4db.html b/dir_6db5af7fcfa17a34c7abf23e195af4db.html new file mode 100644 index 0000000000..c6f101d612 --- /dev/null +++ b/dir_6db5af7fcfa17a34c7abf23e195af4db.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_71f5cbd840fdd1dea9f035c7b1a066ee.html b/dir_71f5cbd840fdd1dea9f035c7b1a066ee.html new file mode 100644 index 0000000000..20d88a7e8e --- /dev/null +++ b/dir_71f5cbd840fdd1dea9f035c7b1a066ee.html @@ -0,0 +1,118 @@ + + + + + + +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..7f8fa7d13d --- /dev/null +++ b/dir_74017a19412e2f90cc6ad11fcac82495.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_7916dda968fadc8673161597975e4c5d.html b/dir_7916dda968fadc8673161597975e4c5d.html new file mode 100644 index 0000000000..1303bcbe52 --- /dev/null +++ b/dir_7916dda968fadc8673161597975e4c5d.html @@ -0,0 +1,109 @@ + + + + + + +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..176330d1ff --- /dev/null +++ b/dir_7a3fd032a1362a6005a1fc9227a8dd86.html @@ -0,0 +1,146 @@ + + + + + + +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..5b573977a6 --- /dev/null +++ b/dir_7a9487ad1984d08627fcf919e6f3d801.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Watchdog Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Watchdog Directory Reference
+
+
+ + + + +

+Files

file  TestWatchdog.cs [code]
 
+
+ + + + diff --git a/dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html b/dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html new file mode 100644 index 0000000000..445fc56436 --- /dev/null +++ b/dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_7ae0efc0613c36c848fa310214e0aee3.html b/dir_7ae0efc0613c36c848fa310214e0aee3.html new file mode 100644 index 0000000000..6f771886e7 --- /dev/null +++ b/dir_7ae0efc0613c36c848fa310214e0aee3.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netstandard2.0
 
+
+ + + + diff --git a/dir_7cd79c49f3850abc2141fa4adfdd1950.html b/dir_7cd79c49f3850abc2141fa4adfdd1950.html new file mode 100644 index 0000000000..d29a1c61d4 --- /dev/null +++ b/dir_7cd79c49f3850abc2141fa4adfdd1950.html @@ -0,0 +1,127 @@ + + + + + + +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_83a6f600c846cd444f33e44bb9b4f9cb.html b/dir_83a6f600c846cd444f33e44bb9b4f9cb.html new file mode 100644 index 0000000000..a8019a6a86 --- /dev/null +++ b/dir_83a6f600c846cd444f33e44bb9b4f9cb.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Release/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_860acef72838dce8d3d54c8f98bc464b.html b/dir_860acef72838dce8d3d54c8f98bc464b.html new file mode 100644 index 0000000000..085df15f52 --- /dev/null +++ b/dir_860acef72838dce8d3d54c8f98bc464b.html @@ -0,0 +1,129 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Rights Directory Reference
+
+ + + + + diff --git a/dir_87a4f2035ed18e30422f4b60aebc4381.html b/dir_87a4f2035ed18e30422f4b60aebc4381.html new file mode 100644 index 0000000000..758e9f5842 --- /dev/null +++ b/dir_87a4f2035ed18e30422f4b60aebc4381.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_900257602d294c4a4799e88420919068.html b/dir_900257602d294c4a4799e88420919068.html new file mode 100644 index 0000000000..bc123d8ffe --- /dev/null +++ b/dir_900257602d294c4a4799e88420919068.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_90400719279795a0c5ea912516a4c874.html b/dir_90400719279795a0c5ea912516a4c874.html new file mode 100644 index 0000000000..80c2dd4c01 --- /dev/null +++ b/dir_90400719279795a0c5ea912516a4c874.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_91e2bbee1291fcb0db7e0417b617d01e.html b/dir_91e2bbee1291fcb0db7e0417b617d01e.html new file mode 100644 index 0000000000..b47601cd5d --- /dev/null +++ b/dir_91e2bbee1291fcb0db7e0417b617d01e.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_9826fb2d31585a830723e6d7089b5d0e.html b/dir_9826fb2d31585a830723e6d7089b5d0e.html new file mode 100644 index 0000000000..5e21d47b5d --- /dev/null +++ b/dir_9826fb2d31585a830723e6d7089b5d0e.html @@ -0,0 +1,174 @@ + + + + + + +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_a01d946a2e1b048dc542232ffcdcf572.html b/dir_a01d946a2e1b048dc542232ffcdcf572.html new file mode 100644 index 0000000000..4ee14008dc --- /dev/null +++ b/dir_a01d946a2e1b048dc542232ffcdcf572.html @@ -0,0 +1,118 @@ + + + + + + +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  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..08e11ef4a9 --- /dev/null +++ b/dir_a24b8c5f308a77f73e7a9e43c0f243d1.html @@ -0,0 +1,109 @@ + + + + + + +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_a44a562b5a12ef1c8495ac1a63e915ea.html b/dir_a44a562b5a12ef1c8495ac1a63e915ea.html new file mode 100644 index 0000000000..802764306c --- /dev/null +++ b/dir_a44a562b5a12ef1c8495ac1a63e915ea.html @@ -0,0 +1,142 @@ + + + + + + +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_a536e49cdf631f66733cf2c9791144ce.html b/dir_a536e49cdf631f66733cf2c9791144ce.html new file mode 100644 index 0000000000..b3ed015d90 --- /dev/null +++ b/dir_a536e49cdf631f66733cf2c9791144ce.html @@ -0,0 +1,133 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IO Directory Reference
+
+ + + + + diff --git a/dir_a99ad55e4d1fa76955df2299f3783cf0.html b/dir_a99ad55e4d1fa76955df2299f3783cf0.html new file mode 100644 index 0000000000..7ac4b0007f --- /dev/null +++ b/dir_a99ad55e4d1fa76955df2299f3783cf0.html @@ -0,0 +1,109 @@ + + + + + + +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..f17774659a --- /dev/null +++ b/dir_b0d0d898ef448ca0a6a170a2896fa60e.html @@ -0,0 +1,121 @@ + + + + + + +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_b2c89c850c962495793d09ea3a2ee385.html b/dir_b2c89c850c962495793d09ea3a2ee385.html new file mode 100644 index 0000000000..9e631c4d68 --- /dev/null +++ b/dir_b2c89c850c962495793d09ea3a2ee385.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_b524b00ec2259c3c83b44909fd47f6e3.html b/dir_b524b00ec2259c3c83b44909fd47f6e3.html new file mode 100644 index 0000000000..4404253378 --- /dev/null +++ b/dir_b524b00ec2259c3c83b44909fd47f6e3.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_b6324197f7ac56e30d6189c3a45eec56.html b/dir_b6324197f7ac56e30d6189c3a45eec56.html new file mode 100644 index 0000000000..9e1d3e72e1 --- /dev/null +++ b/dir_b6324197f7ac56e30d6189c3a45eec56.html @@ -0,0 +1,121 @@ + + + + + + +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_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html b/dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html new file mode 100644 index 0000000000..e03fb85211 --- /dev/null +++ b/dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html @@ -0,0 +1,109 @@ + + + + + + +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_bb25b36c82def1362ea245058c866cdc.html b/dir_bb25b36c82def1362ea245058c866cdc.html new file mode 100644 index 0000000000..0a6e5df87f --- /dev/null +++ b/dir_bb25b36c82def1362ea245058c866cdc.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/Properties Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Properties Directory Reference
+
+
+ + + + +

+Files

file  AssemblyInfo.cs [code]
 
+
+ + + + diff --git a/dir_be6161819238d55fa660c07ade960e53.html b/dir_be6161819238d55fa660c07ade960e53.html new file mode 100644 index 0000000000..7012d5a201 --- /dev/null +++ b/dir_be6161819238d55fa660c07ade960e53.html @@ -0,0 +1,116 @@ + + + + + + +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_c2c4d4ee47e55233c6ea5db8b96422c6.html b/dir_c2c4d4ee47e55233c6ea5db8b96422c6.html new file mode 100644 index 0000000000..736b42129a --- /dev/null +++ b/dir_c2c4d4ee47e55233c6ea5db8b96422c6.html @@ -0,0 +1,158 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Models Directory Reference
+
+ + + + + diff --git a/dir_c5451d9d233744a5b09a29938f0cda9a.html b/dir_c5451d9d233744a5b09a29938f0cda9a.html new file mode 100644 index 0000000000..dbeb37f52c --- /dev/null +++ b/dir_c5451d9d233744a5b09a29938f0cda9a.html @@ -0,0 +1,143 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Security Directory Reference
+
+ + + + + diff --git a/dir_c648ff9d1a57dd8752f4ab2a7c68712c.html b/dir_c648ff9d1a57dd8752f4ab2a7c68712c.html new file mode 100644 index 0000000000..7e1eba29ee --- /dev/null +++ b/dir_c648ff9d1a57dd8752f4ab2a7c68712c.html @@ -0,0 +1,109 @@ + + + + + + +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_c65d377d3c73fb4a07b3637f9c0caf4d.html b/dir_c65d377d3c73fb4a07b3637f9c0caf4d.html new file mode 100644 index 0000000000..8850253690 --- /dev/null +++ b/dir_c65d377d3c73fb4a07b3637f9c0caf4d.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Release Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_c9d0608eee53bfffcc33d03463bbe2db.html b/dir_c9d0608eee53bfffcc33d03463bbe2db.html new file mode 100644 index 0000000000..c5fbc2237f --- /dev/null +++ b/dir_c9d0608eee53bfffcc33d03463bbe2db.html @@ -0,0 +1,113 @@ + + + + + + +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_d45f494620bc0048ee4a31fa4f7391e1.html b/dir_d45f494620bc0048ee4a31fa4f7391e1.html new file mode 100644 index 0000000000..f7d7774036 --- /dev/null +++ b/dir_d45f494620bc0048ee4a31fa4f7391e1.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_d8869fc9da5c696ed284d5c470b7210f.html b/dir_d8869fc9da5c696ed284d5c470b7210f.html new file mode 100644 index 0000000000..c917890982 --- /dev/null +++ b/dir_d8869fc9da5c696ed284d5c470b7210f.html @@ -0,0 +1,109 @@ + + + + + + +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..f97fe5fa5a --- /dev/null +++ b/dir_d88de13ae4b64d4d0766b0c06f1a9edf.html @@ -0,0 +1,109 @@ + + + + + + +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_dbb0c65ea012faeef2906502dd42dfec.html b/dir_dbb0c65ea012faeef2906502dd42dfec.html new file mode 100644 index 0000000000..a6b08196f4 --- /dev/null +++ b/dir_dbb0c65ea012faeef2906502dd42dfec.html @@ -0,0 +1,114 @@ + + + + + + +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  Properties
 
+ + + +

+Files

file  TestServerService.cs [code]
 
+
+ + + + diff --git a/dir_df215ce6792635a450ba5a94b5a17942.html b/dir_df215ce6792635a450ba5a94b5a17942.html new file mode 100644 index 0000000000..018ab5610b --- /dev/null +++ b/dir_df215ce6792635a450ba5a94b5a17942.html @@ -0,0 +1,113 @@ + + + + + + +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..3c01320942 --- /dev/null +++ b/dir_e0c1bccb03249d93bc42ac0968ce43fd.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_e2ec88631ea78d6df8b37d27efa9bfe2.html b/dir_e2ec88631ea78d6df8b37d27efa9bfe2.html new file mode 100644 index 0000000000..a6da9224c0 --- /dev/null +++ b/dir_e2ec88631ea78d6df8b37d27efa9bfe2.html @@ -0,0 +1,118 @@ + + + + + + +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_e928c7e494884ad322b5f6005c2954e1.html b/dir_e928c7e494884ad322b5f6005c2954e1.html new file mode 100644 index 0000000000..f848936f1a --- /dev/null +++ b/dir_e928c7e494884ad322b5f6005c2954e1.html @@ -0,0 +1,111 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_e9975c2f0de13509bd9fb4e31ae732ab.html b/dir_e9975c2f0de13509bd9fb4e31ae732ab.html new file mode 100644 index 0000000000..8e42f94bb3 --- /dev/null +++ b/dir_e9975c2f0de13509bd9fb4e31ae732ab.html @@ -0,0 +1,114 @@ + + + + + + +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_eb7c70823ae63176c38851687b13349d.html b/dir_eb7c70823ae63176c38851687b13349d.html new file mode 100644 index 0000000000..27fa3bb567 --- /dev/null +++ b/dir_eb7c70823ae63176c38851687b13349d.html @@ -0,0 +1,122 @@ + + + + + + +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..f5bce8990d --- /dev/null +++ b/dir_ed78ff3b0fc4a7f5234cdb0b34617476.html @@ -0,0 +1,122 @@ + + + + + + +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..92fb7d8e33 --- /dev/null +++ b/dir_f0581cdd528a911f791df57d0f438bcb.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_f0d41009ce252337feb2b68822c4cfba.html b/dir_f0d41009ce252337feb2b68822c4cfba.html new file mode 100644 index 0000000000..e9fb63989b --- /dev/null +++ b/dir_f0d41009ce252337feb2b68822c4cfba.html @@ -0,0 +1,122 @@ + + + + + + +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..79081b08a0 --- /dev/null +++ b/dir_f2a82faa4c4beef364292694cefca86d.html @@ -0,0 +1,129 @@ + + + + + + +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_fb12273b841438c2f2c9b5bc5398c636.html b/dir_fb12273b841438c2f2c9b5bc5398c636.html new file mode 100644 index 0000000000..a687d3898e --- /dev/null +++ b/dir_fb12273b841438c2f2c9b5bc5398c636.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Release
 
+
+ + + + diff --git a/dir_fcc41a8faa41492aba200a49fc7d0aed.html b/dir_fcc41a8faa41492aba200a49fc7d0aed.html new file mode 100644 index 0000000000..31f97c168e --- /dev/null +++ b/dir_fcc41a8faa41492aba200a49fc7d0aed.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Release/netcoreapp2.1 Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + 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..1425ec530d --- /dev/null +++ b/doxygen.css @@ -0,0 +1,1475 @@ +/* The standard CSS for doxygen 1.8.11 */ + +body, table, div, p, dl { + 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; +} + +/* @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; +} + +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: 4px 6px; + 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; +} + +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 { + 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; +} + +/* @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 */ + +.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: bold; + 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-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.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 { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .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; + -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; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left: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.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left: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; +} + +.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; +} + +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; +} + +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; +} + +.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; + } +} + 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..1e6bf07f9f --- /dev/null +++ b/dynsections.js @@ -0,0 +1,104 @@ +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 123456]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  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
+
+
+ + + + 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..a17990eda8 --- /dev/null +++ b/functions.html @@ -0,0 +1,409 @@ + + + + + + +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_0x7e.html b/functions_0x7e.html new file mode 100644 index 0000000000..2cb534d29c --- /dev/null +++ b/functions_0x7e.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:
+ +

- ~ -

+
+ + + + diff --git a/functions_b.html b/functions_b.html new file mode 100644 index 0000000000..9b79f9119d --- /dev/null +++ b/functions_b.html @@ -0,0 +1,270 @@ + + + + + + +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..aa3a7f07c1 --- /dev/null +++ b/functions_c.html @@ -0,0 +1,758 @@ + + + + + + +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..ae511fbe89 --- /dev/null +++ b/functions_d.html @@ -0,0 +1,537 @@ + + + + + + +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..a4f295fe0f --- /dev/null +++ b/functions_e.html @@ -0,0 +1,195 @@ + + + + + + +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..f0ca0798e5 --- /dev/null +++ b/functions_enum.html @@ -0,0 +1,112 @@ + + + + + + +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..43ca28876b --- /dev/null +++ b/functions_f.html @@ -0,0 +1,170 @@ + + + + + + +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..9c6b35f47f --- /dev/null +++ b/functions_func.html @@ -0,0 +1,196 @@ + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_0x7e.html b/functions_func_0x7e.html new file mode 100644 index 0000000000..72e056870f --- /dev/null +++ b/functions_func_0x7e.html @@ -0,0 +1,145 @@ + + + + + + +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..cdaaf78a7a --- /dev/null +++ b/functions_func_b.html @@ -0,0 +1,174 @@ + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_c.html b/functions_func_c.html new file mode 100644 index 0000000000..23a188c39b --- /dev/null +++ b/functions_func_c.html @@ -0,0 +1,465 @@ + + + + + + +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..589de7cf50 --- /dev/null +++ b/functions_func_d.html @@ -0,0 +1,318 @@ + + + + + + +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..e052b332b9 --- /dev/null +++ b/functions_func_e.html @@ -0,0 +1,162 @@ + + + + + + +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..1b3a5ee2ca --- /dev/null +++ b/functions_func_f.html @@ -0,0 +1,161 @@ + + + + + + +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..925346b1d9 --- /dev/null +++ b/functions_func_g.html @@ -0,0 +1,268 @@ + + + + + + +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..b18b8643ad --- /dev/null +++ b/functions_func_h.html @@ -0,0 +1,182 @@ + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_i.html b/functions_func_i.html new file mode 100644 index 0000000000..433c39f09a --- /dev/null +++ b/functions_func_i.html @@ -0,0 +1,235 @@ + + + + + + +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..6534d50e12 --- /dev/null +++ b/functions_func_j.html @@ -0,0 +1,164 @@ + + + + + + +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..8f0df0d629 --- /dev/null +++ b/functions_func_k.html @@ -0,0 +1,144 @@ + + + + + + +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..cbae1f98a1 --- /dev/null +++ b/functions_func_l.html @@ -0,0 +1,225 @@ + + + + + + +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..096b0969c5 --- /dev/null +++ b/functions_func_m.html @@ -0,0 +1,187 @@ + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_n.html b/functions_func_n.html new file mode 100644 index 0000000000..eae8e362b7 --- /dev/null +++ b/functions_func_n.html @@ -0,0 +1,152 @@ + + + + + + +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..59685a7155 --- /dev/null +++ b/functions_func_o.html @@ -0,0 +1,169 @@ + + + + + + +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..f7887cf1b2 --- /dev/null +++ b/functions_func_p.html @@ -0,0 +1,187 @@ + + + + + + +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..c4764356e4 --- /dev/null +++ b/functions_func_r.html @@ -0,0 +1,352 @@ + + + + + + +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..05a341d526 --- /dev/null +++ b/functions_func_s.html @@ -0,0 +1,323 @@ + + + + + + +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..05dc19a89e --- /dev/null +++ b/functions_func_t.html @@ -0,0 +1,351 @@ + + + + + + +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..e1d0662115 --- /dev/null +++ b/functions_func_u.html @@ -0,0 +1,219 @@ + + + + + + +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..d7fad6112d --- /dev/null +++ b/functions_func_v.html @@ -0,0 +1,158 @@ + + + + + + +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..e5bd529821 --- /dev/null +++ b/functions_func_w.html @@ -0,0 +1,195 @@ + + + + + + +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..f1da07de74 --- /dev/null +++ b/functions_func_z.html @@ -0,0 +1,143 @@ + + + + + + +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..e3c6657cb4 --- /dev/null +++ b/functions_g.html @@ -0,0 +1,308 @@ + + + + + + +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..2772fb4552 --- /dev/null +++ b/functions_h.html @@ -0,0 +1,229 @@ + + + + + + +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..c9bfea8fd3 --- /dev/null +++ b/functions_i.html @@ -0,0 +1,455 @@ + + + + + + +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..c55a89ae7e --- /dev/null +++ b/functions_j.html @@ -0,0 +1,207 @@ + + + + + + +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..e41f7de44a --- /dev/null +++ b/functions_k.html @@ -0,0 +1,148 @@ + + + + + + +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..5bec0da987 --- /dev/null +++ b/functions_l.html @@ -0,0 +1,312 @@ + + + + + + +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..f139c2abf0 --- /dev/null +++ b/functions_m.html @@ -0,0 +1,244 @@ + + + + + + +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..7495149673 --- /dev/null +++ b/functions_n.html @@ -0,0 +1,202 @@ + + + + + + +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..a53cb057c9 --- /dev/null +++ b/functions_o.html @@ -0,0 +1,208 @@ + + + + + + +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..67836a8194 --- /dev/null +++ b/functions_p.html @@ -0,0 +1,319 @@ + + + + + + +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..bd6289fcd0 --- /dev/null +++ b/functions_prop.html @@ -0,0 +1,243 @@ + + + + + + +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..7e5798cf52 --- /dev/null +++ b/functions_prop_b.html @@ -0,0 +1,172 @@ + + + + + + +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..d41a900e21 --- /dev/null +++ b/functions_prop_c.html @@ -0,0 +1,293 @@ + + + + + + +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..e868564af0 --- /dev/null +++ b/functions_prop_d.html @@ -0,0 +1,222 @@ + + + + + + +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..43b9476b44 --- /dev/null +++ b/functions_prop_e.html @@ -0,0 +1,149 @@ + + + + + + +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..e2df914c24 --- /dev/null +++ b/functions_prop_f.html @@ -0,0 +1,140 @@ + + + + + + +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..073b632a07 --- /dev/null +++ b/functions_prop_g.html @@ -0,0 +1,157 @@ + + + + + + +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..ff854e1622 --- /dev/null +++ b/functions_prop_h.html @@ -0,0 +1,153 @@ + + + + + + +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..eaf7960ea1 --- /dev/null +++ b/functions_prop_i.html @@ -0,0 +1,256 @@ + + + + + + +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..8da4e57aaa --- /dev/null +++ b/functions_prop_j.html @@ -0,0 +1,150 @@ + + + + + + +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..cff26cc29f --- /dev/null +++ b/functions_prop_l.html @@ -0,0 +1,166 @@ + + + + + + +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..19d247c5f0 --- /dev/null +++ b/functions_prop_m.html @@ -0,0 +1,169 @@ + + + + + + +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..af77b7809e --- /dev/null +++ b/functions_prop_n.html @@ -0,0 +1,158 @@ + + + + + + +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..6939d881f9 --- /dev/null +++ b/functions_prop_o.html @@ -0,0 +1,157 @@ + + + + + + +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..a8e33f0818 --- /dev/null +++ b/functions_prop_p.html @@ -0,0 +1,208 @@ + + + + + + +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..4904a1167c --- /dev/null +++ b/functions_prop_r.html @@ -0,0 +1,212 @@ + + + + + + +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..17d6bb153c --- /dev/null +++ b/functions_prop_s.html @@ -0,0 +1,206 @@ + + + + + + +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..d282cbcd55 --- /dev/null +++ b/functions_prop_t.html @@ -0,0 +1,189 @@ + + + + + + +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..7cd9e77f8e --- /dev/null +++ b/functions_prop_u.html @@ -0,0 +1,182 @@ + + + + + + +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..059f887b4d --- /dev/null +++ b/functions_prop_v.html @@ -0,0 +1,158 @@ + + + + + + +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..a01221c2e7 --- /dev/null +++ b/functions_prop_w.html @@ -0,0 +1,153 @@ + + + + + + +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..e210fc3188 --- /dev/null +++ b/functions_q.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:
+ +

- q -

+
+ + + + diff --git a/functions_r.html b/functions_r.html new file mode 100644 index 0000000000..8b6005ad6c --- /dev/null +++ b/functions_r.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:
+ +

- r -

+
+ + + + diff --git a/functions_s.html b/functions_s.html new file mode 100644 index 0000000000..648f4533ba --- /dev/null +++ b/functions_s.html @@ -0,0 +1,460 @@ + + + + + + +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..8a307e6fbe --- /dev/null +++ b/functions_t.html @@ -0,0 +1,448 @@ + + + + + + +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..e04ff9edc9 --- /dev/null +++ b/functions_u.html @@ -0,0 +1,286 @@ + + + + + + +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..8dd4ec00b6 --- /dev/null +++ b/functions_v.html @@ -0,0 +1,186 @@ + + + + + + +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..8b2b645348 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,255 @@ + + + + + + +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..8cc379b055 --- /dev/null +++ b/functions_vars_b.html @@ -0,0 +1,203 @@ + + + + + + +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..642fe018e2 --- /dev/null +++ b/functions_vars_c.html @@ -0,0 +1,276 @@ + + + + + + +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..8b660ffbcd --- /dev/null +++ b/functions_vars_d.html @@ -0,0 +1,288 @@ + + + + + + +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..a43414e8bb --- /dev/null +++ b/functions_vars_e.html @@ -0,0 +1,155 @@ + + + + + + +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..96efe43074 --- /dev/null +++ b/functions_vars_f.html @@ -0,0 +1,144 @@ + + + + + + +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..1836b5d3d0 --- /dev/null +++ b/functions_vars_g.html @@ -0,0 +1,156 @@ + + + + + + +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..de9fe9cdd2 --- /dev/null +++ b/functions_vars_h.html @@ -0,0 +1,169 @@ + + + + + + +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..8d019f3982 --- /dev/null +++ b/functions_vars_i.html @@ -0,0 +1,239 @@ + + + + + + +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..5607f73c4f --- /dev/null +++ b/functions_vars_j.html @@ -0,0 +1,166 @@ + + + + + + +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..a135cda271 --- /dev/null +++ b/functions_vars_k.html @@ -0,0 +1,141 @@ + + + + + + +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..be7a7e25fa --- /dev/null +++ b/functions_vars_l.html @@ -0,0 +1,190 @@ + + + + + + +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..81f37d8009 --- /dev/null +++ b/functions_vars_m.html @@ -0,0 +1,161 @@ + + + + + + +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..9b5e8ae9be --- /dev/null +++ b/functions_vars_n.html @@ -0,0 +1,165 @@ + + + + + + +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..da34260e23 --- /dev/null +++ b/functions_vars_o.html @@ -0,0 +1,159 @@ + + + + + + +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..ff0eb288b9 --- /dev/null +++ b/functions_vars_p.html @@ -0,0 +1,199 @@ + + + + + + +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..922b111d9e --- /dev/null +++ b/functions_vars_q.html @@ -0,0 +1,141 @@ + + + + + + +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..28e22a8270 --- /dev/null +++ b/functions_vars_r.html @@ -0,0 +1,220 @@ + + + + + + +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..97a86df2fe --- /dev/null +++ b/functions_vars_s.html @@ -0,0 +1,204 @@ + + + + + + +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..af266fda4e --- /dev/null +++ b/functions_vars_t.html @@ -0,0 +1,185 @@ + + + + + + +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..11b05f8625 --- /dev/null +++ b/functions_vars_u.html @@ -0,0 +1,168 @@ + + + + + + +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..dc871eaee7 --- /dev/null +++ b/functions_vars_v.html @@ -0,0 +1,151 @@ + + + + + + +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..dc76b617b0 --- /dev/null +++ b/functions_vars_w.html @@ -0,0 +1,160 @@ + + + + + + +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..2b496bcf14 --- /dev/null +++ b/functions_w.html @@ -0,0 +1,235 @@ + + + + + + +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..e8bfc819f7 --- /dev/null +++ b/functions_z.html @@ -0,0 +1,144 @@ + + + + + + +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/hierarchy.html b/hierarchy.html new file mode 100644 index 0000000000..1789c42a30 --- /dev/null +++ b/hierarchy.html @@ -0,0 +1,492 @@ + + + + + + +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.Administration
 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.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.ChatCommand
 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.Constants
 CController
 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 Models.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
 CException
 CTgstation.Server.Host.Configuration.FileLoggingConfigurationFile logging configuration options
 CTgstation.Server.Host.Configuration.GeneralConfigurationGeneral configuration options
 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
 CIEventLog
 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.IPostWriteHandler
 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.Components.Watchdog.IWatchdogFactoryFor creating IWatchdogs
 CTgstation.Server.Host.Watchdog.IWatchdogFactoryFactory for 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.DreamMaker >
 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< Repository >
 CTgstation.Server.Host.Controllers.ModelController< UserUpdate >
 CModelSnapshot
 CTgstation.Server.Host.Components.Watchdog.MonitorStateThe (absolute) state of the Watchdog
 CTgstation.Server.Host.NativeMethodsNative methods used by the code
 CTgstation.Server.Host.ProgramEntrypoint for the Process
 CTgstation.Server.Host.Console.ProgramContains the entrypoint for the application
 CTgstation.Server.Host.Service.ProgramContains the entrypoint for the application
 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.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.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.TestSetupWizard
 CTgstation.Server.Host.IO.Tests.TestSymlinkFactory
 CTgstation.Server.Host.Watchdog.Tests.TestWatchdog
 CTgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog
 CTgstation.Server.Host.Watchdog.Tests.TestWatchdogFactoryTests for WatchdogFactory
 CTgstation.Server.Api.Models.TokenRepresents a JWT returned by the API
 CTgstation.Server.Host.Configuration.UpdatesConfigurationConfiguration for the automatic update system
 CTgstation.Server.Api.Models.Internal.UserRepresents a server User
 CTgstation.Server.Host.Components.Chat.UserRepresents a tgs_chat_user datum
 CTgstation.Server.Host.Models.WatchdogReattachInformationBaseBase class for WatchdogReattachInformation
+
+
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000000..cbf356af2f --- /dev/null +++ b/index.html @@ -0,0 +1,283 @@ + + + + + + +tgstation-server: tgstation-server v4: + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + +
+ +
+
+ + +
+ +
+ +
+
+
tgstation-server v4:
+
+
+

+

+

+

+

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.

+

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

1 docker run \
2  -ti \ #start interactive for manual configuration
3  --restart=always \ #if you want maximum uptime
4  --network="host" \ #if your sql server is on the same machine
5  --name="tgs" \ #or whatever else you wanna call it
6  --cap-add=sys_nice \ #allows tgs to schedule DreamDaemon as a higher priority process
7  --init \ #reaps potential zombie processes
8  -p <tgs port>:80 \
9  -p 0.0.0.0:<public game port>:<public game port> \
10  -v /path/to/your/configfile/directory:/config_data \ #only if you want to use manual configuration
11  -v /path/to/store/instances:/tgs4_instances \
12  -v /path/to/your/log/folder:/tgs_logs \
13  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').
  • +
+

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:

1 //Remember, every codebase is different, you probably have better methods for these defines than the ones given here
2 #define TGS_EXTERNAL_CONFIGURATION
3 #define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) var/global/##Name = ##Value
4 #define TGS_READ_GLOBAL(Name) global.##Name
5 #define TGS_WRITE_GLOBAL(Name, Value) global.##Name = ##Value
6 #define TGS_WORLD_ANNOUNCE(message) world << ##message
7 #define TGS_INFO_LOG(message) world.log << "TGS Info: [##message]"
8 #define TGS_ERROR_LOG(message) world.log << "TGS Error: [##message]"
9 #define TGS_NOTIFY_ADMINS(event) world.log << "TGS Admin Message: [##event]"
10 #define TGS_CLIENT_COUNT global.client_cout
11 #define TGS_PROTECT_DATUM(Path) // Leave blank if your codebase doesn't give administrators code reflection capabilities

Anywhere else:

1 var/global/client_count = 0
2 
3 /world/New()
4  ..()
5  TgsNew()
6  TgsInitializationsComplete()
7 
8 /world/Reboot()
9  TgsReboot()
10  ..()
11 
12 /world/Topic()
13  TGS_TOPIC
14  ..()
15 
16 /client/New()
17  ..()
18  ++global.client_count
19 
20 /client/Del()
21  ..()
22  --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):
    1 proxy /tgs localhost:8080 {
    2  transparent
    3 }
  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):
    1 location /tgs {
    2  proxy_pass http://127.0.0.1:8080;
    3  break;
    4 }
  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):
    1 ProxyPass / http://127.0.0.1:8080
    2 ProxyPassReverse / http://127.0.0.1:8080
  8. +
+

See https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html

+

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

+
    +
  • See https://github.com/tgstation/tgstation-server/blob/master/.github/CONTRIBUTING.md "CONTRIBUTING.md"
  • +
+

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..145a4aa925 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client-members.html @@ -0,0 +1,112 @@ + + + + + + +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..ebf2e0f8b9 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html @@ -0,0 +1,234 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..a9a412cbc7 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html @@ -0,0 +1,327 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..998ee0d825 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client-members.html @@ -0,0 +1,114 @@ + + + + + + +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..9a22888b11 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html @@ -0,0 +1,338 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..235a2092b6 --- /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,114 @@ + + + + + + +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..ec4fc914ae --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html @@ -0,0 +1,294 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..3a6aa387da --- /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,114 @@ + + + + + + +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..a3ff247012 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html @@ -0,0 +1,305 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..7c2ffb70a8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html @@ -0,0 +1,376 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
IByondClient Tgstation.Server.Client.Components.IInstanceClient.Byond
+
+get
+
+ +

Access the IByondClient

+ +

Definition at line 19 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IChatBotsClient Tgstation.Server.Client.Components.IInstanceClient.ChatBots
+
+get
+
+ +

Access the IChatBotsClient

+ +

Definition at line 44 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IConfigurationClient Tgstation.Server.Client.Components.IInstanceClient.Configuration
+
+get
+
+ +

Access the IConfigurationClient

+ +

Definition at line 34 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDreamDaemonClient Tgstation.Server.Client.Components.IInstanceClient.DreamDaemon
+
+get
+
+ +

Access the IDreamDaemonClient

+ +

Definition at line 29 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDreamMakerClient Tgstation.Server.Client.Components.IInstanceClient.DreamMaker
+
+get
+
+ +

Access the IDreamMakerClient

+ +

Definition at line 49 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IJobsClient Tgstation.Server.Client.Components.IInstanceClient.Jobs
+
+get
+
+ +

Access the IJobsClient

+ +

Definition at line 54 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Client.Components.IInstanceClient.Metadata
+
+get
+
+ +

The Instance used to create the IInstanceClient

+ +

Definition at line 14 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IRepositoryClient Tgstation.Server.Client.Components.IInstanceClient.Repository
+
+get
+
+ +

Access the IRepositoryClient

+ +

Definition at line 24 of file IInstanceClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IInstanceUserClient Tgstation.Server.Client.Components.IInstanceClient.Users
+
+get
+
+ +

Access the IInstanceUserClient

+ +

Definition at line 39 of file IInstanceClient.cs.

+ +
+
+
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..245d718d1a --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html @@ -0,0 +1,357 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..adeabd0535 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client-members.html @@ -0,0 +1,113 @@ + + + + + + +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..344fd4fe02 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html @@ -0,0 +1,275 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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..41eab6a8b8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html @@ -0,0 +1,275 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..45d3b012fc --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html @@ -0,0 +1,236 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..95e6743b87 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client-members.html @@ -0,0 +1,128 @@ + + + + + + +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..46b62cec8f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html @@ -0,0 +1,776 @@ + + + + + + +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)
 
Task< TResult > Create< TResult > (string route, CancellationToken cancellationToken)
 
Task< TResult > Read< TResult > (string route, CancellationToken cancellationToken)
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, CancellationToken cancellationToken)
 
Task< TResult > Update< TResult > (string route, CancellationToken cancellationToken)
 
Task Update< TBody > (string route, TBody body, CancellationToken cancellationToken)
 
Task Delete (string route, CancellationToken cancellationToken)
 
Task< TResult > Create< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Create< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Patch< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Read< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 
Task Delete (string route, long instanceId, CancellationToken cancellationToken)
 
Task Delete< TBody > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 
Task< TResult > Delete< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 
+ + + + + + + +

+Properties

ApiHeaders Headers [get, set]
 
Uri Url [get]
 
TimeSpan Timeout [get, set]
 
+

Detailed Description

+

Web interface for the API

+ +

Definition at line 11 of file IApiClient.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Delete (string route,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Delete (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Delete< TBody > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Delete< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Patch< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Read< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Read< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Update< TBody > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Update< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Update< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Update< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ApiHeaders Tgstation.Server.Client.IApiClient.Headers
+
+getset
+
+ +

Definition at line 13 of file IApiClient.cs.

+ +

Referenced by Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.IApiClient.Timeout
+
+getset
+
+ +

Definition at line 17 of file IApiClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Client.IApiClient.Url
+
+get
+
+ +

Definition at line 15 of file IApiClient.cs.

+ +
+
+
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..0491d154ef --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory-members.html @@ -0,0 +1,110 @@ + + + + + + +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..d6edea4382 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html @@ -0,0 +1,174 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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..5c84e326b6 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client-members.html @@ -0,0 +1,111 @@ + + + + + + +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..6181025da6 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html @@ -0,0 +1,207 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.IHttpClient.Timeout
+
+getset
+
+ +

The request timeout

+ +

Definition at line 16 of file IHttpClient.cs.

+ +
+
+
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..b0edf066d7 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client-members.html @@ -0,0 +1,115 @@ + + + + + + +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..3a89751864 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html @@ -0,0 +1,357 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..152eb898bb --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger-members.html @@ -0,0 +1,111 @@ + + + + + + +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..a09487f3c7 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html @@ -0,0 +1,202 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..724b01dd75 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client-members.html @@ -0,0 +1,117 @@ + + + + + + +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..ac0654bddc --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html @@ -0,0 +1,361 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
Task<ServerInformation> Tgstation.Server.Client.IServerClient.Version (CancellationToken cancellationToken)
+
+ +

The ServerInformation of the IServerClient

+ +

Implemented in Tgstation.Server.Client.ServerClient.

+ +

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

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
IAdministrationClient Tgstation.Server.Client.IServerClient.Administration
+
+get
+
+
+ +
+
+ + + + + +
+ + + + +
IInstanceManagerClient Tgstation.Server.Client.IServerClient.Instances
+
+get
+
+ +

Access the IInstanceManagerClient

+ +

Definition at line 31 of file IServerClient.cs.

+ +

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

+ +
+
+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.IServerClient.Timeout
+
+getset
+
+ +

The connection timeout

+ +

Definition at line 26 of file IServerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Token Tgstation.Server.Client.IServerClient.Token
+
+getset
+
+ +

The Token used to access the server

+ +

Definition at line 21 of file IServerClient.cs.

+ +

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

+ +
+
+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Client.IServerClient.Url
+
+get
+
+ +

The connected server Uri

+ +

Definition at line 16 of file IServerClient.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IUsersClient Tgstation.Server.Client.IServerClient.Users
+
+get
+
+ +

Access the IUsersClient

+ +

Definition at line 41 of file IServerClient.cs.

+ +
+
+
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..416295135a --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory-members.html @@ -0,0 +1,111 @@ + + + + + + +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..c61471ca06 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html @@ -0,0 +1,243 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
cancellationTokenThe CancellationToken for the operation
timeoutThe TimeSpan representing timeout for the connection
+
+
+
Returns
A Task<TResult> resulting in a new IServerClient
+ +

Implemented in Tgstation.Server.Client.ServerClientFactory.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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..529032cf6f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html @@ -0,0 +1,316 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..6f47d12a4a --- /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,113 @@ + + + + + + +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..f40f840c56 --- /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,242 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamDaemonPath
+
+get
+
+ +

The path to the DreamDaemon executable

+ +

Definition at line 18 of file IByondExecutableLock.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamMakerPath
+
+get
+
+ +

The path to the dm/DreamMaker executable

+ +

Definition at line 23 of file IByondExecutableLock.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.IByondExecutableLock.Version
+
+get
+
+ +

The System.Version of the locked executables

+ +

Definition at line 13 of file IByondExecutableLock.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_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..545a3d49c6 --- /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,312 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+ +

Implemented in Tgstation.Server.Host.Components.Byond.WindowsByondInstaller, and Tgstation.Server.Host.Components.Byond.PosixByondInstaller.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..324fb08477 --- /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,275 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+
+
+ +

Implemented in Tgstation.Server.Host.Components.Byond.ByondManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.IByondManager.ActiveVersion
+
+get
+
+ +

The currently active BYOND version

+ +

Definition at line 17 of file IByondManager.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IReadOnlyList<Version> Tgstation.Server.Host.Components.Byond.IByondManager.InstalledVersions
+
+get
+
+ +

The installed BYOND versions

+ +

Definition at line 22 of file IByondManager.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_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..cd3d20cb7b --- /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,113 @@ + + + + + + +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..9b0f26a5f7 --- /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,272 @@ + + + + + + +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.IsAdmin 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
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.IsAdmin set

+ +

Definition at line 24 of file ICommand.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..d03d898f98 --- /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,156 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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.

+ +
+
+
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..3f8bb94d83 --- /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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+ +
+
+ + + + + + + + +
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
if it is connected, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.Watchdog.Watchdog().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..37983d708c --- /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,110 @@ + + + + + + +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..bc8567302a --- /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,181 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..5241756df7 --- /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,188 @@ + + + + + + +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.Watchdog + +
+ + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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..a640cd98233dcba8d06f68407440aa96d2810c7f GIT binary patch literal 1277 zcmeAS@N?(olHy`uVBq!ia0y~yU~B}k12~w0u*K%)O(_T7dlGf5G3V{qk42oV%3=@&@DweExw!T6eyMNM? zUx_pJZ28If=EnT>(oAVIyXo+N0slCVsiFZK7XI%r7nxyjs1`Q{JHZtD*d|5x4ntm3rxc=n*`5us100O zeeJ62+VH;>-?p&cU`??%&5PMpyX@L$nCjzAZw;WKgj6PN9v22bWk9WeiZR@?=7g&2U%jC5)ES+9k zGB@qfqdj`h>)Ea^E&SVapdxur>y^kYqUOA%Vyjo5p3$%}d+n{B0}sD%2o$gKw_A4j zXf2cMsf)T-j?|ZN*G_hjcPr-RvgI_uO;?~?)&U!(T_c_LO-#rEv^*6K>X zglR8}nbbGNTC7)RnfJZXka7B@7hC3jX}osf$tRnWS$QkcuSw5Ov2r%%%(}tOcF!+= z;o6fq>BY7t+4kGt?zMfg>|nI_@sMhpezu_d70zm>({}YI_kJq4TE9!`rR~?5R`V`T zIHQ}wwtS&vF-0tVS_K$sACz)K1WpcN3uZ)t(yX>X4_m=VA z@>!kS{t0i2z8$|S_*LfDtg=SlNtLNjwYgX~`*MWD#uXLaA<2`ra;Ul|7 zzNZ^SeMNI$lylyR)Als3?LP2Q_e#jQ`;69&f$P7X_Rm|mJUyW(uJ`A=4x9Clw6j$+ z7kvk%ukf1(bxW?XM>)S;`}>brRoKyY-{kH-UB71PlFmFqi&?dASH}zg&YAdRi(hX3 zow_Z-d8^-f`@GKMnR&?Ua;;4El*Pd@&hNv_6SuVP-yJsTT**|2W~WJyzAA6r^XSQ2 zmUVHtlfDT5dc1MZqz}7)A4vOp>8zTk{UUq$GuoW-G1b4tCIO>tucxQOB&De=Dw;uX m20zp3O*$)6Bd1CHWnb?dAT;mfv17opiow&>&t;ucLK6UO05{|S literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context-members.html new file mode 100644 index 0000000000..f1a6802806 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context-members.html @@ -0,0 +1,112 @@ + + + + + + +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..9d90a468c8 --- /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,239 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
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..e50b790a4f --- /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,110 @@ + + + + + + +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..b6d80a4879 --- /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,161 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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
+ +
+
+
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..12d21d282d --- /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,379 @@ + + + + + + +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 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

+ +
+
+ + + + + + + + +
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 on success, 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.

+ +
+
+ +
+
+ + + + + + + + +
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().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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
+ +
+
+ +
+
+ + + + + + + + +
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 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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connected
+
+get
+
+ +

If the IProvider

+ +

Definition at line 16 of file IProvider.cs.

+ +

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..5948434357 --- /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,176 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..7886db5f40 --- /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,114 @@ + + + + + + +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..9c9c62b17f --- /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,305 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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, on failure
+ +

Implemented in Tgstation.Server.Host.Components.Compiler.DmbFactory.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Compiler.IDmbFactory.DmbAvailable
+
+get
+
+ +

If LockNextDmb will succeed

+ +

Definition at line 22 of file IDmbFactory.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..88f7582eed --- /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,110 @@ + + + + + + +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..016d11c224 --- /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,207 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+ +
+
+
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..90b7b6fc8c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider-members.html @@ -0,0 +1,114 @@ + + + + + + +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..80d204d644 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html @@ -0,0 +1,278 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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

+ + + +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.IDmbProvider.DmbName
+
+get
+
+ +

The file name of the .dmb

+ +

Definition at line 14 of file IDmbProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

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..66de0528d4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html @@ -0,0 +1,187 @@ + + + + + + +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.Watchdog + +
+ + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.IEventConsumer.HandleEvent (EventType eventType,
IEnumerable< string > parameters,
CancellationToken cancellationToken 
)
+
+ +

Handle a given eventType

+
Parameters
+ + + + +
eventTypeThe EventType
parametersThe parameters for eventType
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in if more IEventConsumer should run, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.Watchdog, Tgstation.Server.Host.Components.StaticFiles.Configuration, and Tgstation.Server.Host.Components.EventConsumer.

+ +

Referenced by Tgstation.Server.Host.Components.EventConsumer.HandleEvent().

+ +
+
+
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..a0f359b60367269ffd98259ca094136d487a1544 GIT binary patch literal 3330 zcmd6qdpy&7AHZE6$7vmTPU*zz@T#+zoJcL?GIGnXkwm3Pl67&5To#+>2uGn~Xfn1| zjhx7x97L%(!!jh~GMBW;WiDG7+n(?A^qh14Ie(wMUfaIE&pw~;_w)N)-oMY1T`@;g zAW(>$oSX{E!PZSq?q3M7{`qS~@M#d~bR2xCyE?nuNu^S-4SgpUCnwpf7 z2erWE*WqrMV{$-A_UdVM-!CWkO*+clQq|Q;Uh8lzG~&Vg1O;T$)q~Ua%#BJhn08POFXSvggTN%#twnO_r@+iZcBj$Hj}RQI;ccq-7k#g5zi47v8|i%z{dlrTHO zkH1!1uG6SrOtOirdla1E&7Um^8n4YoRM8Ca`(6(-x}Uy`YHE4y72K;pqIJFv<=2 z1^dL5xlbEYe6g20qu^1}6y*>-#H_Lq*u7q zU)0-Zp$#O?rqmB}EV5>9TUD~Qv3Pts+XbPLke?PkGtgZ$(`c;-Stdnwej=o`FYVMI zsF74oM%>|7INy2tiQaF1=8qh<>?(RoD_KW%MOI!)BBt9fO|Fv zW!Aekab2Gz4#A^oaUG-Krg=BJC&S+VnNYu-f(}nU%YOYO+ zUj)?lM{mF{@Uvu)Q=mg}O=JtYyZbV`RiIuI{_1 z3u2a@W~8AP&!gRhSG^pw5mo*=0vnS^8KBpA@;HyqUY6@5E6g_L zCkD2uHx_bKq(`x*FH@0+CM3?LDLyXO?F(#z(5b_>bjkdg>X$v3%X$XGceYg7AuPBX zCo)&N^^pVC#G(of=#kzqH}<7Tv?;>k1Fh`Y`HENl5uRIdyAf#yqP4k_Pd>l*L8V8U z2~g-PdO}_cSe&BM9au3U# zloNo~+i77uZiX|6r=9WlehH{^`oM!QbEj*Wr6qu2u(eKJ$8qu zfLTbrBZ+56MJ|_E`_*z-n+x7%f3z@TY;5RlU&1*A`@qrIqW0gQ(8uI6u%pDH1q5PK zG1q>wjg4&(RIsD&v(0Fs?wti2Ot&p%v6o-XQ4{UAv);+&9-ngH7Ti#e?XMlX+F$nYuP zCwfikqMGTGBGi`b?tE>hU>nBnCk;AV(C2dx8caQPk3P^Acpvp`2Bj@wcC{fW?EXUd zudx1e2M}pbxF#L(T?IP+Zp>oF@#i|fxkyvQMrt@i#3lm~qK?r;0ws{mSXNEaxod8a zz;IrMt?*aKmrz6%%~Q1kXCiu7ZxV%FtGh3~n$Eew5QrRz(wqlL_LFyE&7I&7`2pSpy68o1sz)uW@khDzlSoCmFgxPfPqH?1 zrKQ8n+&nNu&CD*)d5~0Ce|q^v4$X_=s#mFeL?1k58I0^84>O|bS;Po$|Q z`t~IxXC?Wn-vl%`1E+%(PEJWJ8yNsU8{l{mJ~EP-MN_6D)IzSj<}U1?cF|Q)+L2qn zADob=kjB!|A(4C||DqSw`a3(`4GJ+a@%NWe@DKG(n3EcS6*lt91x4QgFKBV`$2<~& z=dMl9b@gP_{L^tEt*!s$ZQ4QP{(?|BNMGJ(eqO}FQ0cJit~B{rxSkF(2&6$q$9t-P zqy4EMMSz@N31}b_bw@$^09E6VAWP?s0YPQNWhXt(a`_WG$CYm#MwS16BqAbQ%%)8{ z>?gZDhJm?aYg(oS%6E??l^(nH4|Fk*_qqYOD%T)*b+(fAB7vrc@FWATZ< zT?XF-LcpQ2&dBZ;Z7!6zRYRk`*cc*jD|GJmKGoDIx+wO0W7){WUy86q^NZS6tNaGu zh$7d{<~AH`efp9|FI#*&P}Nj@Z>Edv6ywJ9(5Q(HdN&v-ai@6Nj4Rp(L!L@=QYcx5 z_+yRg+D_GzIUzsWcaiRKS2Zut8d&l0Rg9~8=ySsa*?1aLKTH7g( z5DZiZ?ccUmMqu=J7wIrBX^;tbbS|J}F7@3f*s&r9+s}<86B{+XX!7Eds;S9(M>+xt zft-GVS<1HU?KvL$4J)Jgmd0E0>|u) z@LN2vR*@HI^TLD}g4uXUcVu(1F!SMPSGf3LZCpN@H59&mzkcY9#a-;Vwv&tHX--)g zOll_5LN~+Fs1=LhqRDlgH51VmUud=ML4bdI#n@08DyIP4O6j?YsuCDVvQd(M3h&lY z!CsEEld^V!df*sVTn$5OGYRb+k2d{vNRd^7Q;R`mwHL<#PLWnQ$J + + + + + +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..c4e97dd55b --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html @@ -0,0 +1,412 @@ + + + + + + +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 StaticFiles.IConfiguration for the IInstance More...
 
+

Detailed Description

+

For interacting with the instance services

+ +

Definition at line 17 of file IInstance.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
IByondManager Tgstation.Server.Host.Components.IInstance.ByondManager
+
+get
+
+ +

The IByondManager for the IInstance

+ +

Definition at line 27 of file IInstance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IChat Tgstation.Server.Host.Components.IInstance.Chat
+
+get
+
+ +

The IChat for the IInstance

+ +

Definition at line 37 of file IInstance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IConfiguration Tgstation.Server.Host.Components.IInstance.Configuration
+
+get
+
+ +

The StaticFiles.IConfiguration for the IInstance

+ +

Definition at line 42 of file IInstance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IRepositoryManager Tgstation.Server.Host.Components.IInstance.RepositoryManager
+
+get
+
+ +

The IRepositoryManager for the IInstance

+ +

Definition at line 22 of file IInstance.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
IWatchdog Tgstation.Server.Host.Components.IInstance.Watchdog
+
+get
+
+ +

The IWatchdog for the IInstance

+ +

Definition at line 32 of file IInstance.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_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..4be09f9e9f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory-members.html @@ -0,0 +1,110 @@ + + + + + + +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..4aa7920fd4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html @@ -0,0 +1,164 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+
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..033572e0f2 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager-members.html @@ -0,0 +1,113 @@ + + + + + + +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..950ad1a127 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html @@ -0,0 +1,298 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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..2e12218902 --- /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,110 @@ + + + + + + +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..e304a87a2e --- /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,165 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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..34766d5795 --- /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,110 @@ + + + + + + +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..3ede16bf65 --- /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,174 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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..b5c9bbfcdc --- /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,174 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..b9056f5ef7 --- /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,125 @@ + + + + + + +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..c1f2879fde --- /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,813 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
cancellationTokenThe CancellationToken for the operation
progressReporterAction<T1> to report 0-100 int progress of the operation
+
+
+
Returns
A Task<TResult> resulting in a Nullable<T> bool representing the merge result that is after a fast forward or up to date, on a non-fast-forward, on a conflict
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.Compile().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 if committish is a sha, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 after a fast forward, on a merge or up to date, on a conflict
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
synchronizeTrackedBranchIf the synchronizations should be made to the tracked reference as opposed to a temporary branch
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in if commits were pushed to the tracked origin reference, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.GitHubOwner
+
+get
+
+ +

The Octokit.Repository.Owner if this IsGitHubRepository

+ +

Definition at line 21 of file IRepository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.GitHubRepoName
+
+get
+
+ +

The Octokit.Repository.Name if this IsGitHubRepository

+ +

Definition at line 26 of file IRepository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.Head
+
+get
+
+ +

The SHA of the IRepository HEAD

+ +

Definition at line 36 of file IRepository.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.IRepository.Tracking
+
+get
+
+ +

If Reference tracks an upstream branch

+ +

Definition at line 31 of file IRepository.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_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..15a4306e01 --- /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,322 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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, if one already exists
+ +

Implemented in Tgstation.Server.Host.Components.Repository.RepositoryManager.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Repository.RepositoryManager.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..63f0e02fe5 --- /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,483 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 , 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 if the directory already existed, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 , the operation will be performed as the user of the Core.Application
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
if the directory was empty and deleted, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 , 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
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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 , 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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 , the operation will be performed as the user of the Core.Application
dataThe data to write. If , 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 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..761e84605f --- /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,110 @@ + + + + + + +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..286f5d7fc5 --- /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,163 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.RegisterProcess (IProcess process)
+
+ +

Register a given process for network prompt reaping

+
Parameters
+ + +
processThe IProcess to register
+
+
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper, and Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper.

+ +
+
+
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..04238f2fa7 --- /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,204 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..5cf48c0a30 --- /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,126 @@ + + + + + + +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..ff27d4fbb1 --- /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,606 @@ + + + + + + +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

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands ()
+
+
+ +
+
+ + + + + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.StopAsync().

+ +
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleChatCommand(), and Tgstation.Server.Host.Components.Watchdog.Watchdog.HandleEvent().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 if the operation succeeded, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionController, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 if the operation succeeded, otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionController, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.TerminateNoLock().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
ApiValidationStatus Tgstation.Server.Host.Components.Watchdog.ISessionController.ApiValidationStatus
+
+get
+
+ +

The DMAPI Components.Watchdog.ApiValidationStatus

+ +

Definition at line 30 of file ISessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup().

+ +
+
+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Watchdog.ISessionController.Dmb
+
+get
+
+ +

The IDmbProvider being used

+ +

Definition at line 35 of file ISessionController.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.ISessionController.IsPrimary
+
+get
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.LaunchImplNoLock().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Host.Components.Watchdog.ISessionController.Port
+
+get
+
+ +

The current port DreamDaemon is listening on

+ +

Definition at line 40 of file ISessionController.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
RebootState Tgstation.Server.Host.Components.Watchdog.ISessionController.RebootState
+
+get
+
+ +

The current RebootState

+ +

Definition at line 50 of file ISessionController.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup().

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.ISessionController.TerminationWasRequested
+
+get
+
+ +

If the DreamDaemon instance sent a

+ +

Definition at line 25 of file ISessionController.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Watchdog.HandlerMonitorWakeup().

+ +
+
+
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..4d22048f8c --- /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,112 @@ + + + + + + +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..63a245b4a0 --- /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,280 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 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..be51f651cb --- /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,121 @@ + + + + + + +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..ad07bd1ff1 --- /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,490 @@ + + + + + + +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.Watchdog + +
+ + + + + + + + + + + + + + + + + + + + + +

+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...
 
RebootState RebootState [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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.Watchdog.

+ +
+
+ +
+
+ + + + + + + + +
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.Watchdog.

+ +
+
+ +
+
+ + + + + + + + +
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.Watchdog.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IWatchdog.Restart (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Restarts the watchdog

+
Parameters
+ + + +
gracefulIf 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.Watchdog.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IWatchdog.Terminate (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Stops the watchdog

+
Parameters
+ + + +
gracefulIf 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.Watchdog.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
Models.CompileJob Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveCompileJob
+
+get
+
+ +

The CompileJob currently running on the server

+ +

Definition at line 27 of file IWatchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonLaunchParameters Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveLaunchParameters
+
+get
+
+ +

The DreamDaemonLaunchParameters the active server is using

+ +

Definition at line 32 of file IWatchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DreamDaemonLaunchParameters Tgstation.Server.Host.Components.Watchdog.IWatchdog.LastLaunchParameters
+
+get
+
+ +

The DreamDaemonLaunchParameters to be applied

+ +

Definition at line 37 of file IWatchdog.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running
+
+get
+
+ +

If the watchdog is running

+ +

Definition at line 17 of file IWatchdog.cs.

+ +
+
+
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..63c0cf4735e911953f5e2e0001be9f5bb49444b8 GIT binary patch literal 2792 zcmd5;dpK0<8lR#kC709Hu92>rC=(TSCQ3?kB85d^*j;2xnwW-0nCc0;8Im~8i z)S@JpL7H*0Ycd+u*3cMC(xNeqGOok0&bRFI&wifs=l!Z2$RF^KKoD<1hc-6b$b;uhBl(0u4^0CF?7RHcV_xN0#qv}#c7rkD-uP0e-(v5Cpr`?=R4tdt za5@a_aBGc-^?LKNZr5|?f)Y4O=v<^tS60IVd+|p!ekZ2JGv(w6P8=jjTH&SP6Xo|s zso+j;Y6j_D1>(p|_83QIMWOTEKbMD-S;b|m+Y_DyrNdhMA6sfde46h}`K1s`V5epy zreIkU9L-M<+i&ZdICCdxS?iMrPy)F?)f|#{;t#5Md*4@n!$Y-dXJ1N8U!K{=#%sa= z{<9R=AD?_AVfjR)JGyItmir18e)5DQ<_u2FvEJv>Nb9p5|*&b znkio-t>3xYyVL%@dF`O}1wT!f+mpPKq`dU#841}(@@b+*&GV#|O|2xzLl1Vi86$!t z2?1Wp6!aJ(bL{j^sM_Kuc^pEIm0OQDQ~fm4o7mG~jq;WX#!$CToGp4M^kOA>W@u}N zUf!ub^Df`Pkq}5SAKb_zmp9c=*WrZ!%(fKNG%At`HldX{Sssp0wZs=n5hXup`53Y7 zgsA{Zm_97)A5XUs2&kT()%2yS5Wtb}9aFyI;WXgZI2;7+>%lAQB(m0z0OJpN;;X&tEp}gUBW$)ge zGxHGMi%QN+cgED{_=eA+gf>&8{Y~kyso~>egXk9#>OZ1-bPgrF`6lo7G`qFAHH=>h zPvYEsX8s{tFO{)>R4JQA`;SAq@ZI1cT(EJLG|^S!Gxh1xY+7=v=qD@{`GU;B}ob zfJt?Qd-0YsctFop1H&lp2p@(C&aW?+7}A2ldce8Cxey%U>}vZE9ypi@6kS9WK&7b? z0H&f_n^x?lF&Ch|9Ue{m_ghKYl=iK_#xn-<63b}u9}Ev?J2zyvtCaK7NSd)C`q zrxt=beVgdI02A4#7Umzwz{FoS$p_>|>+JKjfz~}ywSk8Ex_aj~dleY3X;55O z|Ly3wsB!DH<0eTlS8#I-4_YqUnXzVVLpkZ5%lyR~bRFy-_MU417tac~XUH>JE{vO03Z`##M_=7FIQ%o6*uro!&f_S?Xtw3lCGr8fpvk^& z?`7QlkSxQM(aomAkrC*zhm107mygLK)Rt$GZqxOW;V#+AlJe z_iH59&YnYcYF3P}vemA|I(ufm2qnen8Gp?AY9)XM>A8ez={;%V~Xn#^3FdK4L2MBR$dR@UeR4JCr!L{(O#3J;}=)xfz)J2fh?N)uUrcwfcecE zTR`Z|%|!r1`?H54R|B{0j{ux7GVTF!XkCK*A7YG&Fp@~j21A~sGiNS7s~ooUfu6a| z@`8=%HNc;fOF-+{X$&YX$ELXHuWC>lSa&jX#V8#V8Sy+p6W5HiGfKX333mA~JXS-l z=1)Y<3||3#Gw)om`4UI_a#^vP9FUdPQr}EDNauYjIpg$5x^3*kP8U&$V|wd9W3E_ufMA!xK7<$gNRqC-gn7K(2N)u>s24ef0FnHUZIMmtkp@7O1fE>uM+$}G_+%w5BlB?wQX@|}ENJT&46u!_3!wJWwcJ;TDoL& z)@+4zjQCCMr|W$;+G-_;62Jq)T4q)KHWCOjs%M4t$3MchK$Wx@*w6ZBrz9tsq@B_R zU!1O|Ha5=^%c=sQFN6p7fzooY!$y@3#y1Q5>brtP)dQPmyZ@Rv+tPYXUPj{O^X889 aGTg;Wv-VRuhrnkkjm!$+ul@%z_pHVM 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..476814695d --- /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,110 @@ + + + + + + +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..649c34c74c --- /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,209 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..09f7decd58 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html @@ -0,0 +1,250 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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 Tgstation.Server.Host.Core.IApplication.Version
+
+get
+
+ +

The version of the Application

+ +

Definition at line 23 of file IApplication.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.IApplication.VersionPrefix
+
+get
+
+ +

Prefix to VersionString

+ +

Definition at line 13 of file IApplication.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.IApplication.VersionString
+
+get
+
+ +

A more verbose version of Version

+ +

Definition at line 18 of file IApplication.cs.

+ +

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..9b42429222 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html @@ -0,0 +1,176 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.Security.IdentityCacheObject.IdentityCacheObject().

+ +
+
+
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..70b346a097 --- /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,174 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..b08e32afec --- /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,110 @@ + + + + + + +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..cb13e523ac --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html @@ -0,0 +1,163 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext (Func< IDatabaseContext, Task > operation)
+
+ +

Run an operation in the scope of an IDatabaseContext

+
Parameters
+ + +
operationThe operation to run
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Core.DatabaseContextFactory.

+ +
+
+
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..3974bb9d7b --- /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,186 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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..1234fb2ead --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager-members.html @@ -0,0 +1,113 @@ + + + + + + +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..575a3cdfb5 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html @@ -0,0 +1,315 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 if the job was cancelled, if it couldn't be found
+ +

Implemented in Tgstation.Server.Host.Core.JobManager.

+ +
+
+ +
+
+ + + + + + + + +
int Tgstation.Server.Host.Core.IJobManager.JobProgress (Job job)
+
+ +

Get the Api.Models.Job.Progress for a job

+ +

Implemented in Tgstation.Server.Host.Core.JobManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.IJobManager.RegisterOperation (Job job,
Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation,
CancellationToken cancellationToken 
)
+
+ +

Registers a given Job and begins running it

+
Parameters
+ + + + +
jobThe Job
operationThe operation to run taking the started Job, a IDatabaseContext, progress reporter Action<T1> and a CancellationToken
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing a running operation
+ +

Implemented in Tgstation.Server.Host.Core.JobManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..4ca466beb7 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier-members.html @@ -0,0 +1,111 @@ + + + + + + +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..e2cd5f2c19 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html @@ -0,0 +1,189 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows
+
+get
+
+ +

If the current platform is a Windows platform

+ +

Definition at line 11 of file IPlatformIdentifier.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+
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..f7b87104aa --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html @@ -0,0 +1,299 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.IProcess.Terminate ()
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Core.IProcess.Id
+
+get
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +

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..4ec103806d --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html @@ -0,0 +1,196 @@ + + + + + + +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

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.IProcessBase.SetHighPriority ()
+
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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..afce5449e3 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor-members.html @@ -0,0 +1,111 @@ + + + + + + +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..0dd0128db4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html @@ -0,0 +1,232 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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, on failure
+ +

Implemented in Tgstation.Server.Host.Core.ProcessExecutor.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
argumentsThe arguments for the IProcess
workingDirectoryThe working directory 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.

+ +
+
+
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..1f1ba4dfb6 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler-members.html @@ -0,0 +1,110 @@ + + + + + + +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..eb0768a8e8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html @@ -0,0 +1,175 @@ + + + + + + +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.Watchdog.Watchdog + +
+ + + + + +

+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

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.IRestartHandler.HandleRestart (Version updateVersion,
CancellationToken cancellationToken 
)
+
+ +

Handle a restart of the server

+
Parameters
+ + + +
updateVersionThe Version being updated to, if not being changed
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.Watchdog, and Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+
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..17cbc48c97c8461dea855c51949e2c1fec2b9a40 GIT binary patch literal 1590 zcmbVMYdF+t6#u(rkX%MXc5)q;iONJ7Byx#yzva?|F`<;rEsE?ta`a`##Tm-gDmf_d6fX`#Xo^;$$N!t|$%wfF#D& z$_)SnX`t@{5dv*W@0tX7D7ZLySo8UO(4G6b7ES3)2fe+`U@$~Ty;QBaw7t1>tU;%K#k!7N17jZlEG=G$vu**ROPhx_|EZc?VTpDn&eu1lL1Y7Mh zuW@hl!#WU_eru(fwGFHmb7y&@CC&b;Lm!qte7gENpObTcv+N>!?TvBVju@hS3YMGV zbCY5^98|tI%A|3rd`5;KZ%R(! z{*(LgDhdngoGoP|AZoVLiaG6ECPhFj<~1 z+l@9}?MC?lM+NpXYQZ|}oAmT{04X|ql!GuR0~i-4i{XIl$xIO5vPZ@Sp#Fg;5Lwg9 zdKA_)N*oY+mmDRmKok<0V;KqV?@AQpO~VEDO_>XPk4OWAA|3(TXd6Nz+Jz8bpw2Ld zYnz+(%ivTF$URc#LiD6X#otl>2i;%h3Pg3hzy>sMQAG=gkg6>;qx66qN~7D>O%&!% z{r-eTHIODFG27k_7)2s8vov0}93k0-w{tTCpZ7&Nu|sw;GU3ZS?#n5^0cYxGeM6le z!nj;fYUbgYU$}`YH8Tb#F&ZHhJNAU^NS;kIuQed5x~QWfhTR$yC5u^(^)<`skLZ!# z2NEQ^k05(O&Jj1UYFo0XgfpEV95^jG+j;f*$M^x}hyw~{mIJjLiLTcdhyruj1Z ze9-|>;{-42O(WUWHubTeb;A4$*VfxLXX#j7#VEzbS~~Uko&rD&Vz0yL8N?4)G~5?Bm~8@GZaNGt@vt5Gw$ggHXqC zK`p(ffD%dswKUJd+YOk5T3Wk=(g;!cS8D0XC`-tzBxwsN5=}J;X8|dBzz5pQNSZ@m SbtJ(d4`8gFtm-UqcmD#4734zz literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.html new file mode 100644 index 0000000000..9e8e27d0ff --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.html @@ -0,0 +1,126 @@ + + + + + + +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..1f8861826c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control-members.html @@ -0,0 +1,113 @@ + + + + + + +tgstation-server: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IServerControl Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.IServerControl, including all inherited members.

+ + + + + +
ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager)Tgstation.Server.Host.Core.IServerControl
RegisterForRestart(IRestartHandler handler)Tgstation.Server.Host.Core.IServerControl
Restart()Tgstation.Server.Host.Core.IServerControl
WatchdogPresentTgstation.Server.Host.Core.IServerControl
+ + + + 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..07e584e093 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html @@ -0,0 +1,272 @@ + + + + + + +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...
 
+ + + + +

+Properties

bool WatchdogPresent [get]
 if live updates are supported, . ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this is 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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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
if the update started successfully, if there was another update in progress
+ +

Implemented in Tgstation.Server.Host.Server.

+ +
+
+ +
+
+ + + + + + + + +
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(), and Tgstation.Server.Host.Components.Watchdog.Watchdog.Watchdog().

+ +
+
+ +
+
+ + + + + + + +
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().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.IServerControl.WatchdogPresent
+
+get
+
+ +

if live updates are supported, . ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this is

+ +

Definition at line 16 of file IServerControl.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.Configure().

+ +
+
+
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..bcbbcfef66 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html @@ -0,0 +1,166 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
Task<bool> Tgstation.Server.Host.Core.ISetupWizard.CheckRunWizard (CancellationToken cancellationToken)
+
+ +

Run the setup wizard if necessary

+
Parameters
+ + +
cancellationToken
+
+
+
Returns
+ +

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..0fedf07dfb --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console-members.html @@ -0,0 +1,113 @@ + + + + + + +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..fa3a3e7386 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html @@ -0,0 +1,284 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IConsole.WriteAsync (string text,
bool newLine,
CancellationToken cancellationToken 
)
+
+ +

Write some text to the IConsole

+
Parameters
+ + + + +
textThe string to write
newLineIf there should be a new line after the text
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.Console.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.IO.IConsole.Available
+
+get
+
+ +

If the IConsole is visible to the user

+ +

Definition at line 14 of file IConsole.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_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..5b87260121 --- /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,1036 @@ + + + + + + +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 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

+ +
+
+ + + + + + + + +
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.Core.Application.ConfigureServices().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.CreateDirectory (string path,
CancellationToken cancellationToken 
)
+
+ +

Create a directory at path

+
Parameters
+ + + +
pathThe path of the directory to create
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.DeleteDirectory (string path,
CancellationToken cancellationToken 
)
+
+ +

Recursively delete a directory

+
Parameters
+ + + +
pathThe path to the directory to delete
cancellationTokenA 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().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.DeleteFile (string path,
CancellationToken cancellationToken 
)
+
+ +

Deletes a file at path

+
Parameters
+ + + +
pathThe path of the file to delete
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 if the directory at path exists, otherwise
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.IO.IIOManager.FileExists (string path,
CancellationToken cancellationToken 
)
+
+ +

Check that the file at path exists

+
Parameters
+ + + +
pathThe file to check for existence
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task resulting in if the file at path exists, otherwise
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.IIOManager.PathContainsParentAccess (string path)
+
+ +

Check if a path contains the '..' parent directory accessor

+
Parameters
+ + +
pathThe path to check
+
+
+
Returns
if path contains a '..' accessor, otherwise
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<byte[]> Tgstation.Server.Host.IO.IIOManager.ReadAllBytes (string path,
CancellationToken cancellationToken 
)
+
+ +

Returns all the contents of a file at path as a byte array

+
Parameters
+ + + +
pathThe path of the file to read
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task that results in the contents of a file at path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +
+
+ + + + + + + + +
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 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.Interop.CommContext.CommContext(), and Tgstation.Server.Host.IO.ResolvingIOManager.ResolvingIOManager().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.WriteAllBytes (string path,
byte[] contents,
CancellationToken cancellationToken 
)
+
+ +

Writes some contents to a file at path overwriting previous content

+
Parameters
+ + + + +
pathThe path of the file to write
contentsThe contents of the file
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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().

+ +
+
+
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..f62123d85a --- /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,161 @@ + + + + + + +tgstation-server: Tgstation.Server.Host.IO.IPostWriteHandler Interface Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.IPostWriteHandler Interface Reference
+
+
+
+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

+
+

Definition at line 3 of file IPostWriteHandler.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite (string filePath)
+
+ +

For handling system specific necessities after a write

+
Parameters
+ + +
filePathThe full path to the file that was written
+
+
+ +

Implemented in Tgstation.Server.Host.IO.PosixPostWriteHandler, and Tgstation.Server.Host.IO.WindowsPostWriteHandler.

+ +

Referenced by Tgstation.Server.Host.IO.Tests.TestPostWriteHandler.TestPostWrite(), and Tgstation.Server.Host.IO.Tests.TestPostWriteHandler.TestThrowsWithNullArg().

+ +
+
+
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..b491c6e7fe --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html @@ -0,0 +1,184 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.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..fdadac8ed9 --- /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,401 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
if the directory already existed, otherwise
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +
+
+ +
+
+ + + + + + + + +
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
if the directory does not exist or is empty and was deleted. otherwise
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.ISynchronousIOManager.IsDirectory (string path)
+
+ +

Checks if a given path is a directory

+
Parameters
+ + +
pathThe path to check
+
+
+
Returns
if path is a directory, otherwise
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +
+
+ +
+
+ + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
on success, 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..0b59e45a3a --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_server.html @@ -0,0 +1,198 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.IServer.RestartRequested
+
+get
+
+ +

If the IServer should restart

+ +

Definition at line 14 of file IServer.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_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..5bab397cec --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory-members.html @@ -0,0 +1,110 @@ + + + + + + +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..2a94de2cf7 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html @@ -0,0 +1,176 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +

Referenced by Tgstation.Server.Host.Program.Main().

+ +
+
+
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..859fea0cf5 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html @@ -0,0 +1,565 @@ + + + + + + +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...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+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 10 of file IDatabaseContext.cs.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
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 >.

+ +
+
+ +
+
+ + + + + + + + +
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().

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
DbSet<ChatBot> Tgstation.Server.Host.Models.IDatabaseContext.ChatBots
+
+getset
+
+ +

The Models.ChatBot in the IDatabaseContext

+ +

Definition at line 55 of file IDatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<ChatChannel> Tgstation.Server.Host.Models.IDatabaseContext.ChatChannels
+
+getset
+
+ +

The ChatChannel in the IDatabaseContext

+ +

Definition at line 60 of file IDatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<CompileJob> Tgstation.Server.Host.Models.IDatabaseContext.CompileJobs
+
+get
+
+ +

The CompileJobs in the IDatabaseContext

+ +

Definition at line 35 of file IDatabaseContext.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<DreamDaemonSettings> Tgstation.Server.Host.Models.IDatabaseContext.DreamDaemonSettings
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
DbSet<DreamMakerSettings> Tgstation.Server.Host.Models.IDatabaseContext.DreamMakerSettings
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
DbSet<Instance> Tgstation.Server.Host.Models.IDatabaseContext.Instances
+
+get
+
+ +

The Instances in the IDatabaseContext

+ +

Definition at line 20 of file IDatabaseContext.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<InstanceUser> Tgstation.Server.Host.Models.IDatabaseContext.InstanceUsers
+
+get
+
+ +

The InstanceUsers in the IDatabaseContext

+ +

Definition at line 25 of file IDatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<Job> Tgstation.Server.Host.Models.IDatabaseContext.Jobs
+
+get
+
+ +

The Jobs in the IDatabaseContext

+ +

Definition at line 30 of file IDatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<ReattachInformation> Tgstation.Server.Host.Models.IDatabaseContext.ReattachInformations
+
+getset
+
+ +

The DbSet<TEntity> for Models.ReattachInformations

+ +

Definition at line 70 of file IDatabaseContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
DbSet<RepositorySettings> Tgstation.Server.Host.Models.IDatabaseContext.RepositorySettings
+
+getset
+
+
+ +
+
+ + + + + +
+ + + + +
DbSet<RevisionInformation> Tgstation.Server.Host.Models.IDatabaseContext.RevisionInformations
+
+get
+
+
+ +
+
+ + + + + +
+ + + + +
DbSet<User> Tgstation.Server.Host.Models.IDatabaseContext.Users
+
+get
+
+
+ +
+
+ + + + + +
+ + + + +
DbSet<WatchdogReattachInformation> Tgstation.Server.Host.Models.IDatabaseContext.WatchdogReattachInformations
+
+getset
+
+ +

The DbSet<TEntity> for Models.WatchdogReattachInformations

+ +

Definition at line 75 of file IDatabaseContext.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_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..3293b2a0c8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder-members.html @@ -0,0 +1,111 @@ + + + + + + +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..228f0feb29 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html @@ -0,0 +1,215 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..443d82eb38 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context-members.html @@ -0,0 +1,113 @@ + + + + + + +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..c08c2f475d --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html @@ -0,0 +1,250 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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 all Instance based rights will return 0
+ +

Implemented in Tgstation.Server.Host.Security.AuthenticationContext.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
InstanceUser Tgstation.Server.Host.Security.IAuthenticationContext.InstanceUser
+
+get
+
+ +

The InstanceUser of User if applicable

+ +

Definition at line 20 of file IAuthenticationContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
ISystemIdentity Tgstation.Server.Host.Security.IAuthenticationContext.SystemIdentity
+
+get
+
+ +

The ISystemIdentity of User if applicable

+ +

Definition at line 32 of file IAuthenticationContext.cs.

+ +
+
+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Security.IAuthenticationContext.User
+
+get
+
+ +

The authenticated user

+ +

Definition at line 15 of file IAuthenticationContext.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_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..9c22522fd9 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html @@ -0,0 +1,222 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
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..d832717d32 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector-members.html @@ -0,0 +1,110 @@ + + + + + + +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..e43b634251 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html @@ -0,0 +1,174 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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..2307bf357f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html @@ -0,0 +1,276 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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
if password matches the hash, otherwise
+ +

Implemented in Tgstation.Server.Host.Security.CryptographySuite.

+ +
+
+ +
+
+ + + + + + + + +
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().

+ +
+
+ +
+
+ + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..4cb4b899ee --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html @@ -0,0 +1,210 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+ +
+
+ + + + + + + + +
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 if it doesn't exist or expired
+ +

Implemented in Tgstation.Server.Host.Security.IdentityCache.

+ +
+
+
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..2fbc8b9c77 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html @@ -0,0 +1,265 @@ + + + + + + +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

+ +
+
+ + + + + + + +
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().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Security.ISystemIdentity.Uid
+
+get
+
+
+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Security.ISystemIdentity.Username
+
+get
+
+ +

The user's name

+ +

Definition at line 21 of file ISystemIdentity.cs.

+ +

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..929018ecab --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html @@ -0,0 +1,223 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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 if the user has no ISystemIdentity
+ +

Implemented in Tgstation.Server.Host.Security.WindowsSystemIdentityFactory, and Tgstation.Server.Host.Security.PosixSystemIdentityFactory.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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..efa738c5b6 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html @@ -0,0 +1,208 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + +
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.

+ +
+
+

Property Documentation

+ +
+
+ + + + + +
+ + + + +
TokenValidationParameters Tgstation.Server.Host.Security.ITokenFactory.ValidationParameters
+
+get
+
+ +

The TokenValidationParameters for the ITokenFactory

+ +

Definition at line 16 of file ITokenFactory.cs.

+ +

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_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..f7610417be --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html @@ -0,0 +1,181 @@ + + + + + + +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

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
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.

+ +
+
+
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..717e7118d4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html @@ -0,0 +1,165 @@ + + + + + + +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

+ +
+
+ + + + + + + + +
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..1f4d0b47ce --- /dev/null +++ b/jquery.js @@ -0,0 +1,68 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * 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: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,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.1",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);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.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&&typeof b0==="object"&&"setInterval" in b0},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(bb.JSON&&bb.JSON.parse){return bb.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){var b0,b1;try{if(bb.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)){(bb.execScript||function(b1){bb["eval"].call(bb,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?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.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};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.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";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,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;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):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.nodeName.toLowerCase()]||b.valHooks[this.type];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)?aY:be)}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(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?: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}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||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.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))}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(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(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||a9.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 aG(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=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],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){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},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(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(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 E(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 al(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||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=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(!bc.test(bv)&&bn.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||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.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(a6,"")).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||q.test(this.nodeName)||aZ.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){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),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?bj(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=G(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,s[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]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.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]!=="*"?", "+aV+"; 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=aW(r,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){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(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 G(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(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(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{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,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.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(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=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=$(' + + + +
+ +
+
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..820948b513 --- /dev/null +++ b/namespace_tgstation_1_1_server.html @@ -0,0 +1,118 @@ + + + + + + +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..4453234daf --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api.html @@ -0,0 +1,126 @@ + + + + + + +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..429d8cfabd --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_models.html @@ -0,0 +1,398 @@ + + + + + + +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
 
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

+ +
+
+ + + + + +
+ + + + +
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,
15  Discord
16  }
+ +
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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,
15  Safe,
19  Ultrasafe
20  }
Server will not be able to run shell commands or access files outside it&#39;s working directory ...
+
Server will not be able to run shell commands or access anything but temporary files. Currently unsupported!
+
Server is unrestricted in terms of file access and shell commands
+
+
+
+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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,
15  Sasl,
19  NickServ
20  }
+ + +
+
+
+
+ + + + 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..bca2a35efc --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal.html @@ -0,0 +1,143 @@ + + + + + + +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..845be51c90 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html @@ -0,0 +1,112 @@ + + + + + + +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..dc99040969 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html @@ -0,0 +1,868 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
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,
18  WriteUsers = 1,
22  RestartHost = 2,
26  ChangeVersion = 4,
30  EditOwnPassword = 8,
34  ReadUsers = 16
35  }
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + +
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,
18  ReadActive = 1,
22  ListInstalled = 2,
26  ChangeVersion = 4,
30  CancelInstall = 8
31  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + +
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,
18  WriteEnabled = 1,
22  WriteProvider = 2,
26  WriteChannels = 4,
38  Read = 32,
42  Create = 64,
46  Delete = 128,
50  WriteName = 256,
51  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + +
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,
18  Read = 1,
22  Write = 2,
26  List = 4,
30  Delete = 8
31  }
+ + +
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+ +
+
+
+ +
+
+ + + + + +
+ + + + +
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,
18  ReadRevision = 1,
22  SetPorts = 2,
26  SetAutoStart = 4,
30  SetSecurity = 8,
34  ReadMetadata = 16,
38  SetWebClient = 32,
42  SoftRestart = 64,
46  SoftShutdown = 128,
50  Restart = 256,
54  Shutdown = 512,
58  Start = 1024,
62  SetStartupTimeout = 2048
63  }
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.DreamDaemonSettings.SoftShutdown, Models.DreamDaemon.Running, Models.Internal.DreamDaemonLaunchParameters.AllowWebClient, and Models.Internal.DreamDaemonSettings.AutoStart
+
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.SoftRestart and Models.Internal.DreamDaemonSettings.SoftShutdown
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + +
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,
18  Read = 1,
22  Compile = 2,
26  CancelCompile = 4,
30  SetDme = 8,
38  CompileJobs = 32,
42  SetSecurityLevel = 64
43  }
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
+ +
+
+
+ +
+
+ + + + + +
+ + + + +
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,
18  Read = 1,
22  Create = 2,
26  Rename = 4,
30  Relocate = 8,
34  SetOnline = 16,
38  Delete = 32,
42  List = 64,
46  SetConfiguration = 128,
50  SetAutoUpdate = 256
51  }
+
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
+
+
+
+ +
+
+ + + + + +
+ + + + +
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,
18  ReadUsers = 1,
22  WriteUsers = 2,
26  CreateUsers = 4
27  }
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
+
+
+
+ +
+
+ + + + + +
+ + + + +
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

+
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,
22  SetOrigin = 2,
26  SetSha = 4,
30  MergePullRequest = 8,
34  UpdateBranch = 16,
38  ChangeCommitter = 32,
46  ChangeCredentials = 128,
50  SetReference = 256,
54  Read = 512,
62  Delete = 2048,
66  CancelClone = 4096
67  }
+
User may change Models.Internal.RepositorySettings.AutoUpdatesKeepTestMerges and Models.Internal.RepositorySettings.AutoUpdatesSynchronize
+
User may fetch and merge GitHub pull requests
+
User may change Models.Internal.RepositorySettings.PushTestMergeCommits
+ + + +
User may directly set the sha the Models.Repository&#39;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.Internal.RepositorySettings.AccessToken
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
User may change Models.Internal.RepositorySettings.CommitterName and Models.Internal.RepositorySettings.CommitterEmail
+
+
+
+ +
+
+ + + + + +
+ + + + +
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..e55fa57775 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html @@ -0,0 +1,113 @@ + + + + + + +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..6e6c24b47b --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_tests.html @@ -0,0 +1,113 @@ + + + + + + +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..33fda758f7 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client.html @@ -0,0 +1,197 @@ + + + + + + +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..e89e62f071 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client_1_1_components.html @@ -0,0 +1,161 @@ + + + + + + +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..3ee5dc3ca5 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html @@ -0,0 +1,112 @@ + + + + + + +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..bf4acf5ca2 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client_1_1_tests.html @@ -0,0 +1,114 @@ + + + + + + +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..ae9eda8c49 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host.html @@ -0,0 +1,152 @@ + + + + + + +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..dc1596f68c --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components.html @@ -0,0 +1,262 @@ + + + + + + +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

+ +
+
+ + + + + +
+ + + + +
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,
15  RepoCheckout = 1,
19  RepoFetch = 2,
28 
36  ByondInstallFail = 6,
44  CompileStart = 8,
48  CompileCancelled = 9,
52  CompileFailure = 10,
56  CompileComplete = 11,
57 
62 
66  RepoMergeConflict = 13,
67  }
+ +
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: Reference name, commit sha
+
Parameters: Game directory path, origin commit sha
+
Parameters: Game directory path, "1" if compile succeeded and api validation failed, "0" otherwise
+
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..5d34f7654f --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond.html @@ -0,0 +1,135 @@ + + + + + + +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..d8ce9c9171 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests.html @@ -0,0 +1,112 @@ + + + + + + +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..6fa7981a3b --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat.html @@ -0,0 +1,153 @@ + + + + + + +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..1ceb5cfd75 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands.html @@ -0,0 +1,139 @@ + + + + + + +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..95f29815c6 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers.html @@ -0,0 +1,130 @@ + + + + + + +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..4d085bf50f --- /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,112 @@ + + + + + + +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..50a91f5473 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler.html @@ -0,0 +1,129 @@ + + + + + + +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..218e4c198f --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop.html @@ -0,0 +1,137 @@ + + + + + + +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
 
class  CommCommand
 Represents a command from DD More...
 
class  CommContext
 
class  Constants
 
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..d384f00a0b --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository.html @@ -0,0 +1,125 @@ + + + + + + +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..e9ad6caa76 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files.html @@ -0,0 +1,118 @@ + + + + + + +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..63eb88b4aa --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html @@ -0,0 +1,396 @@ + + + + + + +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  DeadSessionController
 Implements a fake "dead" ISessionController 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 Watchdog More...
 
class  PosixNetworkPromptReaper
 
class  ReattachInformation
 Parameters necessary for duplicating a ISessionController session More...
 
class  SessionController
 
class  SessionControllerFactory
 
class  Watchdog
 
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

+ +
+
+ +

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  {
32  }
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.Ultrasafe
+ +
Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity.Safe
+
Valid API. The game must be run with a security level of Api.Models.DreamDaemonSecurity.Trusted
+
+
+
+ +
+
+ + + + + +
+ + + + +
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,
15  Skip,
19  Restart,
23  Break,
27  Exit
28  }
+
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
+
+
+
+ +
+
+ +

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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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,
15  Shutdown = 1,
19  Restart = 2
20  }
Run DreamDaemon&#39;s normal reboot process
+
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..a84466287a --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests.html @@ -0,0 +1,112 @@ + + + + + + +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  TestWatchdog
 
+
+ + + + 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..1ea2bf48d4 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html @@ -0,0 +1,220 @@ + + + + + + +tgstation-server: Tgstation.Server.Host.Configuration Namespace Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Configuration Namespace Reference
+
+
+ + + + + + + + + + + + + + +

+Classes

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

+ +
+
+ + + + + +
+ + + + +
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.

+ +
+
+ +
+
+ + + + + +
+ + + + +
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,
15  Force,
19  Only,
23  Never
24  }
+ +
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..3b56a4044a --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_console.html @@ -0,0 +1,119 @@ + + + + + + +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..bfc4fdd798 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html @@ -0,0 +1,112 @@ + + + + + + +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..ec9327a939 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_controllers.html @@ -0,0 +1,155 @@ + + + + + + +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..e7a0e57a7d --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_core.html @@ -0,0 +1,192 @@ + + + + + + +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  SetupWizard
 
+
+ + + + 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..291717c390 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html @@ -0,0 +1,129 @@ + + + + + + +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  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..19554144fe --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html @@ -0,0 +1,152 @@ + + + + + + +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
 
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..c8c0793921 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html @@ -0,0 +1,116 @@ + + + + + + +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..c9e4cf10a5 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_models.html @@ -0,0 +1,172 @@ + + + + + + +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..a1fcd93a52 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html @@ -0,0 +1,145 @@ + + + + + + +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 Models.DatabaseContext<TParentContext>s More...
 
class  MSAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns 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  MYAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB 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  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..1917887df5 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_security.html @@ -0,0 +1,165 @@ + + + + + + +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..a1dc1e5e49 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html @@ -0,0 +1,113 @@ + + + + + + +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..9d78aa079f --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_service.html @@ -0,0 +1,122 @@ + + + + + + +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..4ececf06f4 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html @@ -0,0 +1,113 @@ + + + + + + +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..e2abb8e083 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_tests.html @@ -0,0 +1,113 @@ + + + + + + +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..c71b1b5593 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html @@ -0,0 +1,126 @@ + + + + + + +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..30d351fb8c --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html @@ -0,0 +1,115 @@ + + + + + + +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..e18beaa2cd --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_tests.html @@ -0,0 +1,124 @@ + + + + + + +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..d0f0aec228 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_tests_1_1_instance.html @@ -0,0 +1,116 @@ + + + + + + +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..9b0fd76b71 --- /dev/null +++ b/namespacemembers.html @@ -0,0 +1,170 @@ + + + + + + +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..2962159fdb --- /dev/null +++ b/namespacemembers_enum.html @@ -0,0 +1,170 @@ + + + + + + +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..6e2d669dfd --- /dev/null +++ b/namespaces.html @@ -0,0 +1,150 @@ + + + + + + +tgstation-server: Packages + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Packages
+
+
+
Here are the packages with brief descriptions (if available):
+
[detail level 1234567]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 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..04352cdd3f --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,19 @@ +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,'']]] +]; diff --git a/search/all_1.html b/search/all_1.html new file mode 100644 index 0000000000..8cc6a1de90 --- /dev/null +++ b/search/all_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 0000000000..e1ecf1f498 --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,111 @@ +var searchData= +[ + ['accessdenied',['AccessDenied',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#a471564a142fe17f6bc2dbfb2c0e4f490',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#a717260618bbaba0216c35ceb9838ca95',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()'],['../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.html#a19910ce8e445ba705ecb474d1965a5a7',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a8f9871dfdd2ebbc4350bb66fee6ae4de',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#aecc9da4e22de8fb74d6a5821fdfbe649',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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',['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',['AdministrationClient',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#aa5d48433766cd2f29ee60007767f5387',1,'Tgstation::Server::Client::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',['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_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#ade2eaa5d5e27d3f550db6180e0f66b27',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',['AdministrationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#a20ab9f933254691d5334e3a63bb20056',1,'Tgstation::Server::Tests::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()']]], + ['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#a4f0501a51f5c7b8d0e7e619fd7b549a1',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_watchdog.html#acca61aed6e0038e5e4ef133e0e181270',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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.html#ade3aa1dae110fd5b2af6de1f5f394a63',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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()']]], + ['alphaserver',['alphaServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aa8f6aa2d8051cc81ad12d087a470dee3',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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#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',['ApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html',1,'Tgstation::Server::Client']]], + ['apiclient_2ecs',['ApiClient.cs',['../_api_client_8cs.html',1,'']]], + ['apiclientfactory',['apiClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a88beceefb17e9959124806865e6d3b2b',1,'Tgstation::Server::Client::ServerClientFactory']]], + ['apiclientfactory',['ApiClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html',1,'Tgstation::Server::Client']]], + ['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#aea77b7a32420c4b90d6b05e6590cd479',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode)'],['../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',['ApiConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html',1,'Tgstation::Server::Client']]], + ['apiconflictexception_2ecs',['ApiConflictException.cs',['../_api_conflict_exception_8cs.html',1,'']]], + ['apicontroller',['ApiController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['apicontroller',['ApiController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a9bc039fc7d30f133a09da6a51063a3a9',1,'Tgstation::Server::Host::Controllers::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',['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#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',['ApiMismatchException',['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html',1,'Tgstation::Server::Client']]], + ['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#a8076bc5790515504427738f44c50fecd',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['apivalidationsecuritylevel',['ApiValidationSecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#a0a5255beaf799498209fa5649594aff1',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']]], + ['appendalltext',['AppendAllText',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#affa1ddaeeda1cabad4a7fe59c6bd5eef',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['application',['Application',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html',1,'Tgstation::Server::Host::Core']]], + ['application',['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',['../src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_client_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_host_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html',1,'']]], + ['assemblyname',['assemblyName',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aab03c9ba9bd7a845f00bb76282d27018',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.html#a15f533f0d79587d33d5a8be1a534db04',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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',['AsyncDelayer',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html',1,'Tgstation::Server::Host::Core']]], + ['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',['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#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',['AuthenticationContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html',1,'Tgstation::Server::Host::Security']]], + ['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#abeff5ac1db71468960ffd0e0c4a896fd',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.html#a6c8b6d141945660a51073287eb0c1254',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.autoStart()']]], + ['autoupdateinterval',['AutoUpdateInterval',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a940005c299f5ed5a82fc5f4fe26c190d',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#a1d16f79d0962ec9cad0ab96470f46267',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#afeea53a0f4f5663057873de51ee1cfdd',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..c25484f208 --- /dev/null +++ b/search/all_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_10.js b/search/all_10.js new file mode 100644 index 0000000000..e2bcf405e5 --- /dev/null +++ b/search/all_10.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['parameters',['Parameters',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#a7d2ab934fa48b76d965f0d32ba742bfa',1,'Tgstation.Server.Host.Components.Interop.ChatCommand.Parameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html#ac19cfaa2a2bda3872e42e0f6643a1811',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()']]], + ['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#aa5df509165231839cac7619c549d984b',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#af86c9cd8964c7cc3e74142f74012b501',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#af7860cda8ac8b343eeb747780cb22422',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_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',['PlatformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html',1,'Tgstation::Server::Host::Core']]], + ['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#a70bde9bd8b2a01b079ff0996a379081d',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#a4b142e815574ace6403bf69393ec5a3d',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#aa343d746e958dbfe2a22f4a7a4fb33cd',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#a6e727c55d5b952ece68a965c80437082',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',['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_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']]], + ['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#aa81a7a474b859cbf827c4c9f5aaaa3e1',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#a4bcf9795fa6b73278d66c64809714e61',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_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',['Process',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html',1,'Tgstation::Server::Host::Core']]], + ['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',['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#a2ffd7ce9d614fee77ab5d038d7b528e0',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_program.html',1,'Tgstation::Server::Host']]], + ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html',1,'Tgstation::Server::Host::Console']]], + ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html',1,'Tgstation::Server::Host::Service']]], + ['program_2ecs',['Program.cs',['../_program_8cs.html',1,'']]], + ['program_2ecs',['Program.cs',['../_console_2_program_8cs.html',1,'']]], + ['program_2ecs',['Program.cs',['../_service_2_program_8cs.html',1,'']]], + ['progress',['Progress',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#ae2ec2fb03329836c26cdaa3cb6b451c6',1,'Tgstation.Server.Api.Models.Job.Progress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a0f1d18fd7297e239e431009cd72d439b',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']]], + ['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_api_1_1_models_1_1_internal_1_1_chat_bot.html#a98b7028b546ca58d01a01376f4a85469',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',['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_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',['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',['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_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#a120439ca07d4b05156cdf433eb9f22d3',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..3615c2815f --- /dev/null +++ b/search/all_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..abd082a5e7 --- /dev/null +++ b/search/all_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_12.js b/search/all_12.js new file mode 100644 index 0000000000..3754074577 --- /dev/null +++ b/search/all_12.js @@ -0,0 +1,150 @@ +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',['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']]], + ['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,'']]], + ['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',['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()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aed6e0e27662e31247ac29588da0c938d',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.reattachInfoHandler()']]], + ['reattachinfohandler_2ecs',['ReattachInfoHandler.cs',['../_reattach_info_handler_8cs.html',1,'']]], + ['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.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)']]], + ['reattachinformation',['ReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html',1,'Tgstation::Server::Host::Models']]], + ['reattachinformation',['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_2ecs',['ReattachInformation.cs',['../_components_2_watchdog_2_reattach_information_8cs.html',1,'']]], + ['reattachinformation_2ecs',['ReattachInformation.cs',['../_models_2_reattach_information_8cs.html',1,'']]], + ['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)']]], + ['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_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_dead_session_controller.html#a97f00f4296f371039beff6e167b4ff03',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.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#a5b501cafa9cbacf29b84b1ef4413ea52',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.html#af2cfade4b1ded5fdc06086b4957f233a',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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']]], + ['releaseservers',['releaseServers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a4716774c95335450d0bb96b2ecd0908f',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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_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#afdfb89430d7fd8aef04c95b025c587f2',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',['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',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html',1,'Tgstation::Server::Api::Models']]], + ['repository_2ecs',['Repository.cs',['../_tgstation_8_server_8_api_2_models_2_repository_8cs.html',1,'']]], + ['repository_2ecs',['Repository.cs',['../_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html',1,'']]], + ['repositoryclient',['RepositoryClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html',1,'Tgstation::Server::Client::Components']]], + ['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']]], + ['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',['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_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',['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#a2c2572f088140bfc2a3f02a70125024f',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_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',['RepositorySettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html',1,'Tgstation::Server::Host::Models']]], + ['repositorysettings',['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_2ecs',['RepositorySettings.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html',1,'']]], + ['repositorysettings_2ecs',['RepositorySettings.cs',['../_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html',1,'']]], + ['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#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',['RequestTimeoutException',['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html',1,'Tgstation::Server::Client']]], + ['requesttimeoutexception_2ecs',['RequestTimeoutException.cs',['../_request_timeout_exception_8cs.html',1,'']]], + ['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.html#a673a8910c2bcc3d71bccb53114922a5f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#a9f0c78c38b3e322861bbfcdbae28c197',1,'Tgstation::Server::Host::IO::ResolvingIOManager']]], + ['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_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.html#a0c93e7acdfff087a87bb134bd1a7589d',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#afa7dff41e6278cd258796775f58db2fd',1,'Tgstation.Server.Host.Server.Restart(Version newVersion)'],['../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',['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.html#a8fc101bf364f77e0ba3e3fbc8d30a2e9',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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()']]], + ['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#a7958e83719218e0c15fae6210c1227b7',1,'Tgstation::Server::Host::Components::Chat::Commands::RevisionCommand']]], + ['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_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',['RevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html',1,'Tgstation::Server::Host::Models']]], + ['revisioninformation',['RevisionInformation',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html',1,'Tgstation::Server::Api::Models']]], + ['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_components_1_1_compiler_1_1_dmb_provider.html#ab440b461bd435f52e1303ee74cb6115b',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.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,'']]], + ['revisioninformation_2ecs',['RevisionInformation.cs',['../_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html',1,'']]], + ['revisioninformation_2ecs',['RevisionInformation.cs',['../_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html',1,'']]], + ['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()']]], + ['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#ae0b56fabcaa54dd916f95949914543ef',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.html#a6fe901daca4e165bc357c1e8acb20388',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Running()']]], + ['runrequest_3c_20tresult_20_3e',['RunRequest< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#ac61843965bd203ff9a844f6286a68818',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..88fa653199 --- /dev/null +++ b/search/all_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_13.js b/search/all_13.js new file mode 100644 index 0000000000..6090cd5e89 --- /dev/null +++ b/search/all_13.js @@ -0,0 +1,140 @@ +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#a9f99e791238967702c5a03228206262a',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['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#ade4834de2926874e5f985b90adf32c5d',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['section',['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()']]], + ['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#ac5dcb5176f0bb1f01e3276e20e024137',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.html#a15fd1f4732c78529f9a103a9a2303886',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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',['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_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#a3033ece656bca18a46c895609325e3b2',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand(string command, ushort?overridePort, CancellationToken cancellationToken)']]], + ['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',['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',['ServerClient',['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#aeb7a24a33819012790a38d5fceb2c8bb',1,'Tgstation::Server::Client::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',['ServerClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#ae72794d4ee4b75d442896ef3764d435b',1,'Tgstation::Server::Client::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_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#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',['ServerErrorException',['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html',1,'Tgstation::Server::Client']]], + ['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_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#a3f4d7655e24f18f6929e48f48c79b0a2',1,'Tgstation::Server::Host::Service::ServerService']]], + ['serverservice',['ServerService',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html',1,'Tgstation::Server::Host::Service']]], + ['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#a80a1a88d3e1f59d285b91563e86e2ef8',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['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_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,'']]], + ['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)']]], + ['serviceunavailableexception',['ServiceUnavailableException',['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html',1,'Tgstation::Server::Client']]], + ['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#a3a893fde2c1c3dd16fa129faf57c2f10',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['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_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#a300cbc6914bdd6dfdab7335fcea74b31',1,'Tgstation.Server.Host.Components.Watchdog.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.sessionControllerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aead92a89a941f122fb13654f25800182',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.sessionControllerFactory()']]], + ['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_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']]], + ['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#a21f2a1859fe5e8cb8849ffd9ecc01c39',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#ad0affb495878d67188e8b33f3f2f7c0f',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['setupwizard',['SetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html',1,'Tgstation::Server::Host::Core']]], + ['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#aa9c93fb71bf7a221aca3ae30aefd45f6',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#ae22eb2ec4e8b2897cb039bf86559027c',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#a9f6c25271b687235920bca188843a18d',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#a2e40ab7994079110ed29e098aa411179',1,'Tgstation::Server::Host::Models::SqlServerDatabaseContext']]], + ['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_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.html#aa260da43a2be43f444ab05cb5cf4f78a',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#ac34b3c1eaef93da5965e662cf82bac94',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()']]], + ['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#a593a83ee055518859f7cb06ba6a8c3d9',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#a4cde31c616f4ee5dd305d64d7106a3c3',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.html#a7884982a3a38c4626537604cf8b81fe0',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a14d4e572874f34b4630f7d8a87f3d614',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['stoppedat',['StoppedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#ab7e351b9e65178222f91af2329b1d122',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_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',['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_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..518db1da17 --- /dev/null +++ b/search/all_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_14.js b/search/all_14.js new file mode 100644 index 0000000000..f971abe964 --- /dev/null +++ b/search/all_14.js @@ -0,0 +1,230 @@ +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',['Components',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html',1,'Tgstation::Server::Host']]], + ['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_host_1_1_models.html',1,'Tgstation::Server::Host']]], + ['models',['Models',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html',1,'Tgstation::Server::Api']]], + ['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()']]], + ['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']]], + ['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_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.html#ab0e56ebfdfd8385df92ca26bdc4c6d31',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a4a23388af8da4b479f334ccb7e6fa2a5',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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_watchdog.html#a7ce7a5442920dd816d5dd956f91a784b',1,'Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog.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,'']]], + ['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#af09b16bfab8645d880d43ee3281ddf15',1,'Tgstation::Server::Tests::TestingServer']]], + ['testingserver',['TestingServer',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html',1,'Tgstation::Server::Tests']]], + ['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',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Host::Models']]], + ['testmerge',['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',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Api::Models']]], + ['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.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_host_2_components_2_interop_2_test_merge_8cs.html',1,'']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html',1,'']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html',1,'']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html',1,'']]], + ['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',['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_host_1_1_components_1_1_watchdog_1_1_tests.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html',1,'Tgstation::Server::Host::Console']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html',1,'Tgstation::Server::Host::Core']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html',1,'Tgstation::Server::Host::IO']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html',1,'Tgstation::Server::Host::Service']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html',1,'Tgstation::Server::Api::Models']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_tests.html',1,'Tgstation::Server::Host']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html',1,'Tgstation::Server::Host::Watchdog']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_tests.html',1,'Tgstation::Server']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html',1,'Tgstation::Server::Host::Security']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_tests.html',1,'Tgstation::Server::Api']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html',1,'Tgstation::Server::Client::Components']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_client_1_1_tests.html',1,'Tgstation::Server::Client']]], + ['tests',['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',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html',1,'Tgstation::Server::Api::Rights']]], + ['tests',['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']]], + ['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,'']]], + ['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_watchdog.html#a3d4f071406f85b7b7f59fa3ef2c47489',1,'Tgstation::Server::Host::Components::Watchdog::Tests::TestWatchdog']]], + ['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']]], + ['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']]], + ['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',['TestWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog::Tests']]], + ['testwatchdog_2ecs',['TestWatchdog.cs',['../_tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_8cs.html',1,'']]], + ['testwatchdog_2ecs',['TestWatchdog.cs',['../_tgstation_8_server_8_host_8_watchdog_8_tests_2_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',['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_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',['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#a208bd87b1345c14d9da5e89df13d965f',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#a2d4cbeccfd89360632899db93d7068db',1,'Tgstation.Server.Host.Security.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()']]], + ['tokenfactory',['TokenFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html',1,'Tgstation::Server::Host::Security']]], + ['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#a20c17012e5284a3b787315725fcd0a8f',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['watchdog',['Watchdog',['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html',1,'Tgstation::Server::Host']]], + ['watchdog',['Watchdog',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html',1,'Tgstation::Server::Host::Components']]] +]; diff --git a/search/all_15.html b/search/all_15.html new file mode 100644 index 0000000000..1331c0d7a6 --- /dev/null +++ b/search/all_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_15.js b/search/all_15.js new file mode 100644 index 0000000000..ec1f8ce4c9 --- /dev/null +++ b/search/all_15.js @@ -0,0 +1,56 @@ +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',['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',['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()']]], + ['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#a990818be38def1a4d88216f8bec19106',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_controllers_1_1_administration_controller.html#afa09210575a84b625e234e7e0b19fa08',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['updatesconfiguration',['UpdatesConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html',1,'Tgstation::Server::Host::Configuration']]], + ['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()']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html',1,'Tgstation::Server::Api::Models']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html',1,'Tgstation::Server::Host::Models']]], + ['user',['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#a67aaaea73d5c7a55860fb55f783f0534',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#a67aaaea73d5c7a55860fb55f783f0534',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user??throw new ArgumentNullException(nameof(user)), cancellationToken)']]], + ['user',['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',['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_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html',1,'']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html',1,'']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_user_8cs.html',1,'']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_host_2_models_2_user_8cs.html',1,'']]], + ['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',['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_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#ab931666b8099bf3f765545912f07246c',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#ae72f8d5c9b978b0b1d7c242606965a14',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',['UsersClient',['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#aa7e771fad86b68de8483944e9f34a88e',1,'Tgstation::Server::Client::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#afd98e677cc25829f046f588600f5db04',1,'Tgstation::Server::Api::Models::IrcConnectionStringBuilder']]] +]; diff --git a/search/all_16.html b/search/all_16.html new file mode 100644 index 0000000000..bec9d5ddfc --- /dev/null +++ b/search/all_16.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_16.js b/search/all_16.js new file mode 100644 index 0000000000..de3835c670 --- /dev/null +++ b/search/all_16.js @@ -0,0 +1,16 @@ +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#a61bbb0ce50b6f9cf1a1925596adfb294',1,'Tgstation::Server::Host::Components::Chat::Commands::VersionCommand']]], + ['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_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..6d010fdd9d --- /dev/null +++ b/search/all_17.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_17.js b/search/all_17.js new file mode 100644 index 0000000000..7598f7c3be --- /dev/null +++ b/search/all_17.js @@ -0,0 +1,56 @@ +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',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Components::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()'],['../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_components_1_1_watchdog_1_1_watchdog.html#a9a4134527b003d1f96b7ab2ff66bcf6f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#ada6c36ef01a0cdaf67ea13a350c3f073',1,'Tgstation.Server.Host.Watchdog.Watchdog.Watchdog()']]], + ['watchdog_2ecs',['Watchdog.cs',['../_watchdog_2_watchdog_8cs.html',1,'']]], + ['watchdog_2ecs',['Watchdog.cs',['../_components_2_watchdog_2_watchdog_8cs.html',1,'']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::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',['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()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a9d3a5224a3e18f775a58b31d57d2d68a',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#a7cfce286ab4950cdead6b8bdb346c664',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.WatchdogFactory()']]], + ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_components_2_watchdog_2_watchdog_factory_8cs.html',1,'']]], + ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_watchdog_2_watchdog_factory_8cs.html',1,'']]], + ['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_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',['WatchdogReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html',1,'Tgstation::Server::Host::Models']]], + ['watchdogreattachinformation',['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_2ecs',['WatchdogReattachInformation.cs',['../_components_2_watchdog_2_watchdog_reattach_information_8cs.html',1,'']]], + ['watchdogreattachinformation_2ecs',['WatchdogReattachInformation.cs',['../_models_2_watchdog_reattach_information_8cs.html',1,'']]], + ['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)']]], + ['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_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',['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_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',['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_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#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',['WindowsSystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html',1,'Tgstation::Server::Host::Security']]], + ['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#a46f081a94982769acd01d0fdee271b40',1,'Tgstation::Server::Host::Security::WindowsSystemIdentityFactory']]], + ['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_2ecs',['WindowsSystemIdentityFactory.cs',['../_windows_system_identity_factory_8cs.html',1,'']]], + ['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']]], + ['writeentry',['WriteEntry',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#ae799b7a028ad3648a6461e6e4f303d66',1,'Tgstation::Server::Host::Service::ServerService']]], + ['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..ebae42c780 --- /dev/null +++ b/search/all_18.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..6c3ecee06f --- /dev/null +++ b/search/all_19.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..d15ac65f7c --- /dev/null +++ b/search/all_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 0000000000..ece9493f31 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,55 @@ +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']]], + ['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_watchdog.html#a1c27122cd40a1ca6dce7541771b02925',1,'Tgstation::Server::Host::Components::Watchdog::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']]], + ['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()']]], + ['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',['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#a587e646654bf8da5649d9000b4477fd0',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',['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#a04c8863ccdb6d8f93c56eec22e3015d5',1,'Tgstation::Server::Host::Components::Chat::Commands::ByondCommand']]], + ['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_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#a60fa22db0b488a68e33b3064cacce100',1,'Tgstation::Server::Host::Controllers::ByondController']]], + ['byondcontroller',['ByondController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['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',['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_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',['../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',['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_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']]], + ['byondrevisionsurl',['ByondRevisionsURL',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a4754b35c4e46769dfbd68848e0cf25a6',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondRevisionsURL()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a4f049a779f2a0f9cb4df7692f0f964ca',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondRevisionsURL()']]], + ['byondrights',['ByondRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a1b28f8bc257c1a074cf173efd0456df3',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#aea9d261dae80fdb3bf6ab8145171d46c',1,'Tgstation::Server::Tests::Instance::ByondTest']]], + ['byondtest',['ByondTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html',1,'Tgstation::Server::Tests::Instance']]], + ['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.html#a807567508fae94081bae2bcf76832476',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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..9f526c67cd --- /dev/null +++ b/search/all_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 0000000000..8a1d5b55ea --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,235 @@ +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#a1c5938fcf5da45fee492376d8883bf6e',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#a72e3b9af0f14b0856ec772dc97253699',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#a5a949bc37b02a109980173b1ff20399c',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.html#a97085b58f31ff80dd895999204f5323f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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',['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_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_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a0d7153e43face73f9fc1a32c3d5d3ae6',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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_chat_1_1_chat.html#a2b3416bb9a400628d5de0737b0649ef0',1,'Tgstation.Server.Host.Components.Chat.Chat.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']]], + ['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',['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',['ChatBot',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#add74cb30324a1304ff383cf1d9bae5bf',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#add74cb30324a1304ff383cf1d9bae5bf',1,'Tgstation.Server.Client.Components.ChatBotsClient.ChatBot(Routes.Chat, settings??throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)']]], + ['chatbot',['ChatBot',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html',1,'Tgstation::Server::Host::Models']]], + ['chatbot_2ecs',['ChatBot.cs',['../_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html',1,'']]], + ['chatbot_2ecs',['ChatBot.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html',1,'']]], + ['chatbot_2ecs',['ChatBot.cs',['../_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html',1,'']]], + ['chatbotrights',['ChatBotRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#aebba9a7e4532e81a20267e8aef5a0c1a',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#a322c40d10b0b8b65802c71a899a555d9',1,'Tgstation::Server::Client::Components::ChatBotsClient']]], + ['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_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',['ChatChannel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html',1,'Tgstation::Server::Host::Models']]], + ['chatchannel_2ecs',['ChatChannel.cs',['../_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html',1,'']]], + ['chatchannel_2ecs',['ChatChannel.cs',['../_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html',1,'']]], + ['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',['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_2ecs',['ChatController.cs',['../_chat_controller_8cs.html',1,'']]], + ['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.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',['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_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']]], + ['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']]], + ['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']]], + ['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',['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_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']]], + ['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#a3682abd9b8fae252cea8693806c18751',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',['ClientException',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a5949cd7fd2b3647b5125539d19ad4837',1,'Tgstation.Server.Client.ClientException.ClientException(ErrorMessage errorMessage, HttpStatusCode statusCode)'],['../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,'']]], + ['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',['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#a9fb9b0ef078701162f9a307bf04af648',1,'Tgstation::Server::Host::Components::Interop::CommContext']]], + ['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_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#a19b7848fe3eabd08f9d9e0b78e5bdb00',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#a5498a09cf4cd995afe61de7953dce4eb',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_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',['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',['CompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html',1,'Tgstation::Server::Api::Models']]], + ['compilejob',['CompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html',1,'Tgstation::Server::Host::Models']]], + ['compilejob_2ecs',['CompileJob.cs',['../_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html',1,'']]], + ['compilejob_2ecs',['CompileJob.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html',1,'']]], + ['compilejob_2ecs',['CompileJob.cs',['../_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html',1,'']]], + ['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#a67d79ce7c94a98f4dd7089d189f34524',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',['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_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',['ConfigurationClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html',1,'Tgstation::Server::Client::Components']]], + ['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#a9ed3e9d430a0a4dbe5b2a3e3298089ca',1,'Tgstation::Server::Host::Controllers::ConfigurationController']]], + ['configurationcontroller',['ConfigurationController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['configurationcontroller_2ecs',['ConfigurationController.cs',['../_configuration_controller_8cs.html',1,'']]], + ['configurationfile',['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#af2423b817b8e4de1892e915b0c4e3e17',1,'Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile(Routes.Configuration, file??throw new ArgumentNullException(nameof(file)), instance.Id, cancellationToken)']]], + ['configurationfile',['ConfigurationFile',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html',1,'Tgstation::Server::Api::Models']]], + ['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#acb3c9f570b2e931a10a68704532b0bbd',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#a80083c87de2b165124b6c6953b2ee0b8',1,'Tgstation::Server::Tests::Instance::ConfigurationTest']]], + ['configurationtest',['ConfigurationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html',1,'Tgstation::Server::Tests::Instance']]], + ['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#ab89952f2131ddba86a3f4139fb50170f',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#a7643be4ae03233876ff0e289a509f7a6',1,'Tgstation.Server.Host.Core.Application.Configure()']]], + ['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)']]], + ['conflictexception',['ConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html',1,'Tgstation::Server::Client']]], + ['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()']]], + ['connectionstringbuilder',['ConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#ad05d53870ccf4a4f84731fe53b9c9ac5',1,'Tgstation::Server::Api::Models::Internal::ChatBot']]], + ['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',['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_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,'']]], + ['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#a26c8a971d94af552e5933deaccbbe693',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#a0976873c7f5654dbe88919ed3cb20d84',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()']]], + ['createdat',['CreatedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a5b61bfb463576adccbcc143775c74e17',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()']]], + ['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']]], + ['createsymlink',['CreateSymlink',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adc3f3c0ed330781000ab0b2d40cb164c',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['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_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',['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_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',['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#a4ce8957a37fb57bfc9c668dc27d4789a',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#a31776b2e24df56f546403200b1deca44',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['currentsecurity',['CurrentSecurity',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#ae2fb4a77b5f46f2767268817d21c5543',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..7b814aa947 --- /dev/null +++ b/search/all_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 0000000000..ee58bc1e27 --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,148 @@ +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',['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_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',['DatabaseContext',['../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',['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.html#aa86f5e197902ff9040ebad86aae9aa87',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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',['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',['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_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',['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_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']]], + ['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']]], + ['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#a611b1fe066e2d97bbc5dbf82990e9ea4',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#a4ea0be29aa3d968c39cda83f68f6d2f2',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#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',['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_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#abe6a8573e1dabb518760ad0855b22a32',1,'Tgstation::Server::Host::Components::Chat::Providers::DiscordProvider']]], + ['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_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.html#aa26a6dee1037f057d0f0e6ec9e900e6f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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_watchdog.html#a72945efe8e875c584d900d0fb4b65b8d',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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_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.html#a70e22da88b370e3539d8169e1e180a78',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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',['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_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#a1537e8b8f8b55841d8d1b51104acb521',1,'Tgstation::Server::Host::Components::Compiler::DmbProvider']]], + ['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_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()']]], + ['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',['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#a07ea709f152d79ddf11c1dfdaa939212',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',['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_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#ad6d82fab816712a4c95163e0ee2a4d7d',1,'Tgstation::Server::Host::Controllers::DreamDaemonController']]], + ['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_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#ad77abe10668410cba5ce7d9cffae8d5f',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_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',['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',['DreamDaemonSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html',1,'Tgstation::Server::Host::Models']]], + ['dreamdaemonsettings_2ecs',['DreamDaemonSettings.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html',1,'']]], + ['dreamdaemonsettings_2ecs',['DreamDaemonSettings.cs',['../_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html',1,'']]], + ['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',['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',['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_host_1_1_components_1_1_instance.html#a5774569e57a7e7b15ce6dafed0904ab0',1,'Tgstation.Server.Host.Components.Instance.DreamMaker()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a52a78e5aab609ed3f68150cb564ad36c',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,'']]], + ['dreammaker_2ecs',['DreamMaker.cs',['../_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html',1,'']]], + ['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']]], + ['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_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#a5434cff9c9fa15212f0630672f48de13',1,'Tgstation::Server::Host::Controllers::DreamMakerController']]], + ['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_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#adc212b63c58ed202b097aec0e0058aa1',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',['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..d8de5560e2 --- /dev/null +++ b/search/all_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 0000000000..3ea57edd39 --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['editownpassword',['EditOwnPassword',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a6ca04cb3c1c0f79210a1e67312debeb5',1,'Tgstation::Server::Api::Rights']]], + ['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#a91b36df3e83da4a8ffe59078a42daf71',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#ab52157bda4ab6e1b453b5173664293ed',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#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.html#ac4126749d4e2424a415446c3ebf48aba',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.eventConsumer()']]], + ['eventconsumer',['EventConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html',1,'Tgstation::Server::Host::Components']]], + ['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']]], + ['exception',['Exception',['../class_exception.html',1,'']]], + ['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#a352a2e4fca4b6b1ee4bd4f8d85b077cd',1,'Tgstation::Server::Host::Components::Watchdog::LaunchResult']]], + ['expiresat',['ExpiresAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html#a086733898b6eace9e4955bcec93f60e0',1,'Tgstation::Server::Api::Models::Token']]] +]; diff --git a/search/all_6.html b/search/all_6.html new file mode 100644 index 0000000000..9ba0cc2b4d --- /dev/null +++ b/search/all_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..9384ec9b3b --- /dev/null +++ b/search/all_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_7.js b/search/all_7.js new file mode 100644 index 0000000000..5267f42597 --- /dev/null +++ b/search/all_7.js @@ -0,0 +1,47 @@ +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',['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()']]], + ['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']]], + ['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()']]], + ['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()']]], + ['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',['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()'],['../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()']]], + ['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,'']]] +]; diff --git a/search/all_8.html b/search/all_8.html new file mode 100644 index 0000000000..37566c5d83 --- /dev/null +++ b/search/all_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_8.js b/search/all_8.js new file mode 100644 index 0000000000..bcd970455d --- /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']]], + ['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.html#a9eab0207acd21f8f06ef008df2d61745',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a178ed9b62dd800979386d441ca989daf',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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']]], + ['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_watchdog_1_1_watchdog.html#a484088dd4558dd1dd9f0fbbdbb599240',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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_watchdog.html#a62c17ace3d7865490e9c0d8e492d0556',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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#afb31b85982da4d643b45bf3d8dfbb130',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#afd36342d24501775cf48756d3bea8481',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['homecontroller',['HomeController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a82d77ee6d7adf13e10baf0815ad9bc7b',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_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',['HttpClient',['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#ae30abd8d943980aeb8c192df877b7df8',1,'Tgstation.Server.Client.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()']]], + ['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..c8c51023c2 --- /dev/null +++ b/search/all_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_9.js b/search/all_9.js new file mode 100644 index 0000000000..a6dfeded24 --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,278 @@ +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',['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',['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_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,'']]], + ['ieventlog',['IEventLog',['../class_i_event_log.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,'']]], + ['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_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.html#a3ba15c20184939f91f6e9d7a0fd7b4b6',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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()'],['../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#aae94010ef435d895bb9ba3f364f025bb',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#aae94010ef435d895bb9ba3f364f025bb',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()']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html',1,'Tgstation::Server::Host::Components']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html',1,'Tgstation::Server::Api::Models']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html',1,'Tgstation::Server::Host::Models']]], + ['instance_2ecs',['Instance.cs',['../_tgstation_8_server_8_host_2_components_2_instance_8cs.html',1,'']]], + ['instance_2ecs',['Instance.cs',['../_tgstation_8_server_8_api_2_models_2_instance_8cs.html',1,'']]], + ['instance_2ecs',['Instance.cs',['../_tgstation_8_server_8_host_2_models_2_instance_8cs.html',1,'']]], + ['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',['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#a62eb74d4e58236abc641302411f0a74f',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['instancecontroller',['InstanceController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['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_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',['InstanceFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html',1,'Tgstation::Server::Host::Components']]], + ['instancefactory_2ecs',['InstanceFactory.cs',['../_instance_factory_8cs.html',1,'']]], + ['instanceid',['InstanceId',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aada7e9533c390909c481bccacde92809',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_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#aa8b80c16040cf6cfaddc7d3dc2ea4b2e',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',['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#ab516b86153bf676b7fdb67991966140e',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',['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#a33c97d009719c310c8242a1ef28114d6',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',['InstanceManagerTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#a73adf4e69e5b73873008b16ad115eece',1,'Tgstation::Server::Tests::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',['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_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',['InstanceUser',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html',1,'Tgstation::Server::Host::Models']]], + ['instanceuser',['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#a622a63b2de1299e16c06422a974e9ad5',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#a622a63b2de1299e16c06422a974e9ad5',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_host_2_models_2_instance_user_8cs.html',1,'']]], + ['instanceuser_2ecs',['InstanceUser.cs',['../_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html',1,'']]], + ['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']]], + ['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_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',['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_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#afb9b796b0c0d73c9defa7022970d2df3',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#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',['InsufficientPermissionsException',['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html',1,'Tgstation::Server::Client']]], + ['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',['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',['IrcProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a711efbb2f0ceda3aaedf3679b1f40acc',1,'Tgstation::Server::Host::Components::Chat::Providers::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,'']]], + ['isadmin',['IsAdmin',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a527f796f242818b5f5b4295b5e13618f',1,'Tgstation::Server::Host::Components::Chat::Channel']]], + ['isadminchannel',['IsAdminChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a27b963c9da5483620abcda59430a40ae',1,'Tgstation::Server::Api::Models::ChatChannel']]], + ['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#add1f585c29f82a5c3cf51449fdd1b18a',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()']]], + ['isprivate',['IsPrivate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a6bbefb9342439c1b750972ea7a7c0eea',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#a95db5f348d8b87a14dda2f13512dc5ac',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#a70489703e160a96f7cbfce4ee3c93fca',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_components_1_1_watchdog_1_1_i_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['iwatchdog',['IWatchdog',['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html',1,'Tgstation::Server::Host::Watchdog']]], + ['iwatchdog_2ecs',['IWatchdog.cs',['../_watchdog_2_i_watchdog_8cs.html',1,'']]], + ['iwatchdog_2ecs',['IWatchdog.cs',['../_components_2_watchdog_2_i_watchdog_8cs.html',1,'']]], + ['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',['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_2ecs',['IWatchdogFactory.cs',['../_watchdog_2_i_watchdog_factory_8cs.html',1,'']]], + ['iwatchdogfactory_2ecs',['IWatchdogFactory.cs',['../_components_2_watchdog_2_i_watchdog_factory_8cs.html',1,'']]] +]; diff --git a/search/all_a.html b/search/all_a.html new file mode 100644 index 0000000000..4cb31f0c97 --- /dev/null +++ b/search/all_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 0000000000..bf0e48e456 --- /dev/null +++ b/search/all_a.js @@ -0,0 +1,39 @@ +var searchData= +[ + ['job',['Job',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html',1,'Tgstation::Server::Api::Models']]], + ['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',['Job',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html',1,'Tgstation::Server::Host::Models']]], + ['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()']]], + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html',1,'']]], + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_api_2_models_2_job_8cs.html',1,'']]], + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_host_2_models_2_job_8cs.html',1,'']]], + ['jobcontroller',['JobController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['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']]], + ['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',['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',['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_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#a5f646af3c627f87b1d1ad93823dac1d1',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',['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.html#a2a584a5aa2482d9633d9ce43f6f9b678',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#a4ad9e9f0e2c8b563ced74e92016fca15',1,'Tgstation.Server.Host.Core.IJobManager.JobProgress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a2d57c5575e0567728756688920dbab40',1,'Tgstation.Server.Host.Core.JobManager.JobProgress()']]], + ['jobs',['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()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a9c1a9f80ee10d57d0bb37c7dcaf546',1,'Tgstation.Server.Host.Core.JobManager.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',['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',['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#ad9ce63452e0d98011d7b5e2290829e22',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['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_2ecs',['JsonTrackingContext.cs',['../_json_tracking_context_8cs.html',1,'']]], + ['jwtauthenticationscheme',['jwtAuthenticationScheme',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a4403f03ad002102af684e2995e8723d7',1,'Tgstation::Server::Api::ApiHeaders']]] +]; diff --git a/search/all_b.html b/search/all_b.html new file mode 100644 index 0000000000..d34a612ecc --- /dev/null +++ b/search/all_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..c1ae2cae73 --- /dev/null +++ b/search/all_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_c.js b/search/all_c.js new file mode 100644 index 0000000000..904e5c45f3 --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,36 @@ +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.html#a61de338f74feed0cb373483240b3dffd',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.LastLaunchParameters()']]], + ['lastpasswordupdate',['LastPasswordUpdate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a2e31754b4423b05b1cf70971c64f871d',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.html#aacb3fa9c077e16c526b414cd51fb0780',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Launch()']]], + ['launchimplnolock',['LaunchImplNoLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#ab6fa199ad1a32758b21d2859501dc89f',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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',['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#a0912c19c5d26607b99ebbe1de5249043',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_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()'],['../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_watchdog.html#a5c31f1451dc2f882f6b6f2b2de5d1802',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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()']]], + ['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..712223c661 --- /dev/null +++ b/search/all_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 0000000000..e65568d8c9 --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,76 @@ +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_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)']]], + ['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']]], + ['maxmessagesize',['MaxMessageSize',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a116a4da609b283433e39d9e59187b8d4',1,'Tgstation::Server::Host::Service::ServerService']]], + ['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',['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',['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#a142a8e898772ff9f5a793e3103a8c19d',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',['ModelController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#aae03be6187527e319e078f16f05f029d',1,'Tgstation::Server::Host::Controllers::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_2edreammaker_20_3e',['ModelController< Api.Models.DreamMaker >',['../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_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.html#a86ac25d930ec327fea5fd7540dd7bb71',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['monitorlifetimes',['MonitorLifetimes',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a7cbe1dfd3b29d5128cea3bdffa966da8',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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.html#af9d17410c801667ca78231f4913d1cc6',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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']]], + ['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']]], + ['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']]], + ['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',['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_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']]] +]; diff --git a/search/all_e.html b/search/all_e.html new file mode 100644 index 0000000000..d553ffa22d --- /dev/null +++ b/search/all_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 0000000000..ce7638d70a --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,25 @@ +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#acef80d9c1b4b3cf124c4e4bea9618165',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.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()']]], + ['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']]], + ['number',['Number',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#a91cb81663a87f96476a47a2628ac1a86',1,'Tgstation::Server::Api::Models::TestMergeParameters']]] +]; diff --git a/search/all_f.html b/search/all_f.html new file mode 100644 index 0000000000..c77391a046 --- /dev/null +++ b/search/all_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 0000000000..7fc479205e --- /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#ab13b7ab56475e680b571d14f7c06e52d',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..025587a716 --- /dev/null +++ b/search/classes_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..86dc4ffe65 --- /dev/null +++ b/search/classes_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 0000000000..5d17a2faca --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['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..f306d99db8 --- /dev/null +++ b/search/classes_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_10.js b/search/classes_10.js new file mode 100644 index 0000000000..a73ec2ce78 --- /dev/null +++ b/search/classes_10.js @@ -0,0 +1,21 @@ +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,'']]], + ['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..7d9c149d9d --- /dev/null +++ b/search/classes_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_11.js b/search/classes_11.js new file mode 100644 index 0000000000..b691249438 --- /dev/null +++ b/search/classes_11.js @@ -0,0 +1,41 @@ +var searchData= +[ + ['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']]], + ['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',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Host::Models']]], + ['testmerge',['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',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Api::Models']]], + ['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']]], + ['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_components_1_1_watchdog_1_1_tests_1_1_test_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog::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..1f1842b5fc --- /dev/null +++ b/search/classes_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_12.js b/search/classes_12.js new file mode 100644 index 0000000000..af3ff1e38f --- /dev/null +++ b/search/classes_12.js @@ -0,0 +1,13 @@ +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_api_1_1_models_1_1_user.html',1,'Tgstation::Server::Api::Models']]], + ['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',['User',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html',1,'Tgstation::Server::Host::Models']]], + ['user',['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']]], + ['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..59251e1df7 --- /dev/null +++ b/search/classes_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..79c6566a4d --- /dev/null +++ b/search/classes_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_14.js b/search/classes_14.js new file mode 100644 index 0000000000..78d1a66992 --- /dev/null +++ b/search/classes_14.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Watchdog']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::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']]], + ['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',['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']]], + ['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..014caf809d --- /dev/null +++ b/search/classes_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_2.js b/search/classes_2.js new file mode 100644 index 0000000000..6869a7395a --- /dev/null +++ b/search/classes_2.js @@ -0,0 +1,36 @@ +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',['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',['ChatBot',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html',1,'Tgstation::Server::Host::Models']]], + ['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',['ChatChannel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html',1,'Tgstation::Server::Host::Models']]], + ['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',['CompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html',1,'Tgstation::Server::Api::Models']]], + ['compilejob',['CompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html',1,'Tgstation::Server::Host::Models']]], + ['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,'']]], + ['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..2e97201181 --- /dev/null +++ b/search/classes_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_3.js b/search/classes_3.js new file mode 100644 index 0000000000..f3ce78e9aa --- /dev/null +++ b/search/classes_3.js @@ -0,0 +1,29 @@ +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',['DreamDaemonSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html',1,'Tgstation::Server::Host::Models']]], + ['dreammaker',['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',['DreamMaker',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html',1,'Tgstation::Server::Api::Models']]], + ['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..776fee3757 --- /dev/null +++ b/search/classes_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_4.js b/search/classes_4.js new file mode 100644 index 0000000000..049152110c --- /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']]], + ['exception',['Exception',['../class_exception.html',1,'']]] +]; diff --git a/search/classes_5.html b/search/classes_5.html new file mode 100644 index 0000000000..69bbcc8bf0 --- /dev/null +++ b/search/classes_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..2db08a0140 --- /dev/null +++ b/search/classes_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_6.js b/search/classes_6.js new file mode 100644 index 0000000000..47dffe47e7 --- /dev/null +++ b/search/classes_6.js @@ -0,0 +1,5 @@ +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']]] +]; diff --git a/search/classes_7.html b/search/classes_7.html new file mode 100644 index 0000000000..fd67346e60 --- /dev/null +++ b/search/classes_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..369fe529a2 --- /dev/null +++ b/search/classes_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_8.js b/search/classes_8.js new file mode 100644 index 0000000000..bf6e0be664 --- /dev/null +++ b/search/classes_8.js @@ -0,0 +1,110 @@ +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']]], + ['ieventlog',['IEventLog',['../class_i_event_log.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']]], + ['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_api_1_1_models_1_1_instance.html',1,'Tgstation::Server::Api::Models']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html',1,'Tgstation::Server::Host::Components']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html',1,'Tgstation::Server::Host::Models']]], + ['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',['InstanceUser',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html',1,'Tgstation::Server::Host::Models']]], + ['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',['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']]], + ['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',['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']]] +]; diff --git a/search/classes_9.html b/search/classes_9.html new file mode 100644 index 0000000000..188dbb3807 --- /dev/null +++ b/search/classes_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_9.js b/search/classes_9.js new file mode 100644 index 0000000000..1db7f58602 --- /dev/null +++ b/search/classes_9.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['job',['Job',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html',1,'Tgstation::Server::Api::Models']]], + ['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',['Job',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html',1,'Tgstation::Server::Host::Models']]], + ['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..e7610d3554 --- /dev/null +++ b/search/classes_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..4fc0a3f691 --- /dev/null +++ b/search/classes_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..d2a582ec44 --- /dev/null +++ b/search/classes_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_c.js b/search/classes_c.js new file mode 100644 index 0000000000..92f408a0fc --- /dev/null +++ b/search/classes_c.js @@ -0,0 +1,33 @@ +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_2edreammaker_20_3e',['ModelController< Api.Models.DreamMaker >',['../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_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']]], + ['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']]], + ['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']]], + ['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']]] +]; diff --git a/search/classes_d.html b/search/classes_d.html new file mode 100644 index 0000000000..0fa42149b8 --- /dev/null +++ b/search/classes_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..238ea09cb9 --- /dev/null +++ b/search/classes_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_e.js b/search/classes_e.js new file mode 100644 index 0000000000..11df87fafa --- /dev/null +++ b/search/classes_e.js @@ -0,0 +1,17 @@ +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_service_1_1_program.html',1,'Tgstation::Server::Host::Service']]], + ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html',1,'Tgstation::Server::Host::Console']]], + ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_program.html',1,'Tgstation::Server::Host']]], + ['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..94d95003ec --- /dev/null +++ b/search/classes_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_f.js b/search/classes_f.js new file mode 100644 index 0000000000..5e0ac20ab2 --- /dev/null +++ b/search/classes_f.js @@ -0,0 +1,26 @@ +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',['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']]], + ['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_host_1_1_components_1_1_repository_1_1_repository.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['repository',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html',1,'Tgstation::Server::Api::Models']]], + ['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_api_1_1_models_1_1_internal_1_1_repository_settings.html',1,'Tgstation::Server::Api::Models::Internal']]], + ['repositorysettings',['RepositorySettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html',1,'Tgstation::Server::Host::Models']]], + ['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',['RevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html',1,'Tgstation::Server::Host::Models']]], + ['revisioninformation',['RevisionInformation',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html',1,'Tgstation::Server::Api::Models']]], + ['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..aba8d799d1 --- /dev/null +++ b/search/enums_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..a8d3843014 --- /dev/null +++ b/search/enums_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..ef7d632953 --- /dev/null +++ b/search/enums_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..57bac2ef74 --- /dev/null +++ b/search/enums_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..f35d7a7952 --- /dev/null +++ b/search/enums_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..b579463d8c --- /dev/null +++ b/search/enums_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..b21542b19d --- /dev/null +++ b/search/enums_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..75f8f8c3fc --- /dev/null +++ b/search/enums_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..037ed27809 --- /dev/null +++ b/search/enums_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..83192d354d --- /dev/null +++ b/search/enumvalues_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..0715ef5a3c --- /dev/null +++ b/search/enumvalues_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..62cedc4718 --- /dev/null +++ b/search/enumvalues_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..0f9b5e9fc0 --- /dev/null +++ b/search/enumvalues_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..9ebb356280 --- /dev/null +++ b/search/enumvalues_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..daa496de78 --- /dev/null +++ b/search/enumvalues_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..bd37793579 --- /dev/null +++ b/search/enumvalues_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..656e478842 --- /dev/null +++ b/search/enumvalues_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..2c3a1c9deb --- /dev/null +++ b/search/enumvalues_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..983dccb577 --- /dev/null +++ b/search/enumvalues_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..a8b553fcb9 --- /dev/null +++ b/search/enumvalues_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..5d9b2d6860 --- /dev/null +++ b/search/enumvalues_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..e947a47a04 --- /dev/null +++ b/search/enumvalues_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..5da877611e --- /dev/null +++ b/search/enumvalues_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..679c7cec11 --- /dev/null +++ b/search/enumvalues_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..6e27e1535b --- /dev/null +++ b/search/enumvalues_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..86a4cd9149 --- /dev/null +++ b/search/enumvalues_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..0b637cf9cd --- /dev/null +++ b/search/files_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 0000000000..04352cdd3f --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,19 @@ +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,'']]] +]; diff --git a/search/files_1.html b/search/files_1.html new file mode 100644 index 0000000000..1094e74a48 --- /dev/null +++ b/search/files_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_1.js b/search/files_1.js new file mode 100644 index 0000000000..fafe7baf97 --- /dev/null +++ b/search/files_1.js @@ -0,0 +1,28 @@ +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',['../src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_client_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../src_2_tgstation_8_server_8_host_2_assembly_info_8cs.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs.html',1,'']]], + ['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..58e9714b92 --- /dev/null +++ b/search/files_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_10.js b/search/files_10.js new file mode 100644 index 0000000000..0e8c530a1e --- /dev/null +++ b/search/files_10.js @@ -0,0 +1,30 @@ +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,'']]], + ['reattachinfohandler_2ecs',['ReattachInfoHandler.cs',['../_reattach_info_handler_8cs.html',1,'']]], + ['reattachinformation_2ecs',['ReattachInformation.cs',['../_components_2_watchdog_2_reattach_information_8cs.html',1,'']]], + ['reattachinformation_2ecs',['ReattachInformation.cs',['../_models_2_reattach_information_8cs.html',1,'']]], + ['reattachinformationbase_2ecs',['ReattachInformationBase.cs',['../_reattach_information_base_8cs.html',1,'']]], + ['rebootstate_2ecs',['RebootState.cs',['../_reboot_state_8cs.html',1,'']]], + ['repository_2ecs',['Repository.cs',['../_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html',1,'']]], + ['repository_2ecs',['Repository.cs',['../_tgstation_8_server_8_api_2_models_2_repository_8cs.html',1,'']]], + ['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,'']]], + ['repositorysettings_2ecs',['RepositorySettings.cs',['../_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html',1,'']]], + ['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,'']]], + ['revisioninformation_2ecs',['RevisionInformation.cs',['../_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html',1,'']]], + ['revisioninformation_2ecs',['RevisionInformation.cs',['../_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html',1,'']]], + ['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..3fcb1cc7cd --- /dev/null +++ b/search/files_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_11.js b/search/files_11.js new file mode 100644 index 0000000000..8dd77b7686 --- /dev/null +++ b/search/files_11.js @@ -0,0 +1,21 @@ +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,'']]], + ['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..f68184b0ea --- /dev/null +++ b/search/files_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_12.js b/search/files_12.js new file mode 100644 index 0000000000..8a26bb4345 --- /dev/null +++ b/search/files_12.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['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,'']]], + ['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_host_2_models_2_test_merge_8cs.html',1,'']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html',1,'']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html',1,'']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html',1,'']]], + ['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,'']]], + ['testsetupwizard_2ecs',['TestSetupWizard.cs',['../_test_setup_wizard_8cs.html',1,'']]], + ['testsymlinkfactory_2ecs',['TestSymlinkFactory.cs',['../_test_symlink_factory_8cs.html',1,'']]], + ['testwatchdog_2ecs',['TestWatchdog.cs',['../_tgstation_8_server_8_host_8_tests_2_components_2_watchdog_2_test_watchdog_8cs.html',1,'']]], + ['testwatchdog_2ecs',['TestWatchdog.cs',['../_tgstation_8_server_8_host_8_watchdog_8_tests_2_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_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..8f4d9e9353 --- /dev/null +++ b/search/files_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_13.js b/search/files_13.js new file mode 100644 index 0000000000..9703719168 --- /dev/null +++ b/search/files_13.js @@ -0,0 +1,13 @@ +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_host_2_models_2_user_8cs.html',1,'']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html',1,'']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_user_8cs.html',1,'']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html',1,'']]], + ['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..49b98f8b93 --- /dev/null +++ b/search/files_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..ade46a7a84 --- /dev/null +++ b/search/files_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_15.js b/search/files_15.js new file mode 100644 index 0000000000..ca3adc8807 --- /dev/null +++ b/search/files_15.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['watchdog_2ecs',['Watchdog.cs',['../_components_2_watchdog_2_watchdog_8cs.html',1,'']]], + ['watchdog_2ecs',['Watchdog.cs',['../_watchdog_2_watchdog_8cs.html',1,'']]], + ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_components_2_watchdog_2_watchdog_factory_8cs.html',1,'']]], + ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_watchdog_2_watchdog_factory_8cs.html',1,'']]], + ['watchdogreattachinformation_2ecs',['WatchdogReattachInformation.cs',['../_components_2_watchdog_2_watchdog_reattach_information_8cs.html',1,'']]], + ['watchdogreattachinformation_2ecs',['WatchdogReattachInformation.cs',['../_models_2_watchdog_reattach_information_8cs.html',1,'']]], + ['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..a08dbd36c4 --- /dev/null +++ b/search/files_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_2.js b/search/files_2.js new file mode 100644 index 0000000000..4c446b8f72 --- /dev/null +++ b/search/files_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['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..647fc8d0bf --- /dev/null +++ b/search/files_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_3.js b/search/files_3.js new file mode 100644 index 0000000000..e9254a7bac --- /dev/null +++ b/search/files_3.js @@ -0,0 +1,39 @@ +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_internal_2_chat_bot_8cs.html',1,'']]], + ['chatbot_2ecs',['ChatBot.cs',['../_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html',1,'']]], + ['chatbot_2ecs',['ChatBot.cs',['../_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html',1,'']]], + ['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,'']]], + ['chatchannel_2ecs',['ChatChannel.cs',['../_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html',1,'']]], + ['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_internal_2_compile_job_8cs.html',1,'']]], + ['compilejob_2ecs',['CompileJob.cs',['../_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html',1,'']]], + ['compilejob_2ecs',['CompileJob.cs',['../_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html',1,'']]], + ['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,'']]], + ['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..186557a6c5 --- /dev/null +++ b/search/files_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_4.js b/search/files_4.js new file mode 100644 index 0000000000..287e33d30f --- /dev/null +++ b/search/files_4.js @@ -0,0 +1,31 @@ +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,'']]], + ['dreamdaemonsettings_2ecs',['DreamDaemonSettings.cs',['../_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html',1,'']]], + ['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,'']]], + ['dreammaker_2ecs',['DreamMaker.cs',['../_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html',1,'']]], + ['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..671abd3472 --- /dev/null +++ b/search/files_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_5.js b/search/files_5.js new file mode 100644 index 0000000000..b36fbf9f3c --- /dev/null +++ b/search/files_5.js @@ -0,0 +1,7 @@ +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,'']]] +]; diff --git a/search/files_6.html b/search/files_6.html new file mode 100644 index 0000000000..73aff188f2 --- /dev/null +++ b/search/files_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..364f42023e --- /dev/null +++ b/search/files_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..f9f7943f60 --- /dev/null +++ b/search/files_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..306f000280 --- /dev/null +++ b/search/files_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_9.js b/search/files_9.js new file mode 100644 index 0000000000..1ee945e0c0 --- /dev/null +++ b/search/files_9.js @@ -0,0 +1,108 @@ +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,'']]], + ['instance_2ecs',['Instance.cs',['../_tgstation_8_server_8_host_2_components_2_instance_8cs.html',1,'']]], + ['instance_2ecs',['Instance.cs',['../_tgstation_8_server_8_host_2_models_2_instance_8cs.html',1,'']]], + ['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,'']]], + ['instanceuser_2ecs',['InstanceUser.cs',['../_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html',1,'']]], + ['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,'']]], + ['iwatchdog_2ecs',['IWatchdog.cs',['../_watchdog_2_i_watchdog_8cs.html',1,'']]], + ['iwatchdogfactory_2ecs',['IWatchdogFactory.cs',['../_components_2_watchdog_2_i_watchdog_factory_8cs.html',1,'']]], + ['iwatchdogfactory_2ecs',['IWatchdogFactory.cs',['../_watchdog_2_i_watchdog_factory_8cs.html',1,'']]] +]; diff --git a/search/files_a.html b/search/files_a.html new file mode 100644 index 0000000000..2f6ff8fe18 --- /dev/null +++ b/search/files_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_a.js b/search/files_a.js new file mode 100644 index 0000000000..de28f0259f --- /dev/null +++ b/search/files_a.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html',1,'']]], + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_api_2_models_2_job_8cs.html',1,'']]], + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_host_2_models_2_job_8cs.html',1,'']]], + ['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..3e51d90e7d --- /dev/null +++ b/search/files_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..af4920295d --- /dev/null +++ b/search/files_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..3d4c2c220e --- /dev/null +++ b/search/files_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..70516d6209 --- /dev/null +++ b/search/files_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..147a74e9b9 --- /dev/null +++ b/search/files_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_f.js b/search/files_f.js new file mode 100644 index 0000000000..2f1ab71bc6 --- /dev/null +++ b/search/files_f.js @@ -0,0 +1,17 @@ +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',['../_service_2_program_8cs.html',1,'']]], + ['program_2ecs',['Program.cs',['../_program_8cs.html',1,'']]], + ['program_2ecs',['Program.cs',['../_console_2_program_8cs.html',1,'']]], + ['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..6bc52b6198 --- /dev/null +++ b/search/functions_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 0000000000..97a7891b92 --- /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#aea77b7a32420c4b90d6b05e6590cd479',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode)'],['../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)']]], + ['apicontroller',['ApiController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a9bc039fc7d30f133a09da6a51063a3a9',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)']]], + ['appendalltext',['AppendAllText',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#affa1ddaeeda1cabad4a7fe59c6bd5eef',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['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..648831fd7a --- /dev/null +++ b/search/functions_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 0000000000..5274af267e --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['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()']]], + ['byond',['Byond',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a587e646654bf8da5649d9000b4477fd0',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..8bc4de4a77 --- /dev/null +++ b/search/functions_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_10.js b/search/functions_10.js new file mode 100644 index 0000000000..6e590fea64 --- /dev/null +++ b/search/functions_10.js @@ -0,0 +1,52 @@ +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#afdfb89430d7fd8aef04c95b025c587f2',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.html#a673a8910c2bcc3d71bccb53114922a5f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#a9f0c78c38b3e322861bbfcdbae28c197',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.html#a0c93e7acdfff087a87bb134bd1a7589d',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#afa7dff41e6278cd258796775f58db2fd',1,'Tgstation.Server.Host.Server.Restart(Version newVersion)']]], + ['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()']]], + ['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#ac61843965bd203ff9a844f6286a68818',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..e1e427c170 --- /dev/null +++ b/search/functions_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_11.js b/search/functions_11.js new file mode 100644 index 0000000000..fac5c43d46 --- /dev/null +++ b/search/functions_11.js @@ -0,0 +1,48 @@ +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#a9f99e791238967702c5a03228206262a',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['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#a3033ece656bca18a46c895609325e3b2',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand(string command, ushort?overridePort, CancellationToken cancellationToken)']]], + ['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#a3a893fde2c1c3dd16fa129faf57c2f10',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()']]], + ['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#a21f2a1859fe5e8cb8849ffd9ecc01c39',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.html#aa260da43a2be43f444ab05cb5cf4f78a',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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()']]], + ['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.html#a7884982a3a38c4626537604cf8b81fe0',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a14d4e572874f34b4630f7d8a87f3d614',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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..8dac9d29be --- /dev/null +++ b/search/functions_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_12.js b/search/functions_12.js new file mode 100644 index 0000000000..90681e3332 --- /dev/null +++ b/search/functions_12.js @@ -0,0 +1,64 @@ +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.html#ab0e56ebfdfd8385df92ca26bdc4c6d31',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a4a23388af8da4b479f334ccb7e6fa2a5',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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_watchdog.html#a7ce7a5442920dd816d5dd956f91a784b',1,'Tgstation.Server.Host.Components.Watchdog.Tests.TestWatchdog.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_watchdog.html#a3d4f071406f85b7b7f59fa3ef2c47489',1,'Tgstation::Server::Host::Components::Watchdog::Tests::TestWatchdog']]], + ['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']]], + ['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']]], + ['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..5422011291 --- /dev/null +++ b/search/functions_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_13.js b/search/functions_13.js new file mode 100644 index 0000000000..82934cc142 --- /dev/null +++ b/search/functions_13.js @@ -0,0 +1,17 @@ +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()']]], + ['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()']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a67aaaea73d5c7a55860fb55f783f0534',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#a67aaaea73d5c7a55860fb55f783f0534',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']]] +]; diff --git a/search/functions_14.html b/search/functions_14.html new file mode 100644 index 0000000000..cb681fe912 --- /dev/null +++ b/search/functions_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..f3ae69267a --- /dev/null +++ b/search/functions_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_15.js b/search/functions_15.js new file mode 100644 index 0000000000..7b330017d7 --- /dev/null +++ b/search/functions_15.js @@ -0,0 +1,19 @@ +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_components_1_1_watchdog_1_1_watchdog.html#a9a4134527b003d1f96b7ab2ff66bcf6f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#ada6c36ef01a0cdaf67ea13a350c3f073',1,'Tgstation.Server.Host.Watchdog.Watchdog.Watchdog()']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a7cfce286ab4950cdead6b8bdb346c664',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']]], + ['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()']]], + ['writeentry',['WriteEntry',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#ae799b7a028ad3648a6461e6e4f303d66',1,'Tgstation::Server::Host::Service::ServerService']]], + ['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..18e14286c1 --- /dev/null +++ b/search/functions_16.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..5747ddd02c --- /dev/null +++ b/search/functions_17.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..c93d089465 --- /dev/null +++ b/search/functions_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_2.js b/search/functions_2.js new file mode 100644 index 0000000000..f1f63452d4 --- /dev/null +++ b/search/functions_2.js @@ -0,0 +1,85 @@ +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.html#a97085b58f31ff80dd895999204f5323f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#add74cb30324a1304ff383cf1d9bae5bf',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#add74cb30324a1304ff383cf1d9bae5bf',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']]], + ['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']]], + ['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']]], + ['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()']]], + ['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#a3682abd9b8fae252cea8693806c18751',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#a5949cd7fd2b3647b5125539d19ad4837',1,'Tgstation.Server.Client.ClientException.ClientException(ErrorMessage errorMessage, HttpStatusCode statusCode)'],['../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)']]], + ['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#a19b7848fe3eabd08f9d9e0b78e5bdb00',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#a5498a09cf4cd995afe61de7953dce4eb',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#af2423b817b8e4de1892e915b0c4e3e17',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#a7643be4ae03233876ff0e289a509f7a6',1,'Tgstation::Server::Host::Core::Application']]], + ['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#a26c8a971d94af552e5933deaccbbe693',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#a0976873c7f5654dbe88919ed3cb20d84',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()']]], + ['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()']]], + ['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()']]], + ['createsymlink',['CreateSymlink',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adc3f3c0ed330781000ab0b2d40cb164c',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['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..caa48ea262 --- /dev/null +++ b/search/functions_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_3.js b/search/functions_3.js new file mode 100644 index 0000000000..320a33f098 --- /dev/null +++ b/search/functions_3.js @@ -0,0 +1,36 @@ +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()']]], + ['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.html#aa26a6dee1037f057d0f0e6ec9e900e6f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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_watchdog.html#a72945efe8e875c584d900d0fb4b65b8d',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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()']]], + ['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#a07ea709f152d79ddf11c1dfdaa939212',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#a52a78e5aab609ed3f68150cb564ad36c',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..a9c64adf91 --- /dev/null +++ b/search/functions_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_4.js b/search/functions_4.js new file mode 100644 index 0000000000..f5b2fe5051 --- /dev/null +++ b/search/functions_4.js @@ -0,0 +1,10 @@ +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']]] +]; diff --git a/search/functions_5.html b/search/functions_5.html new file mode 100644 index 0000000000..9d135fa08e --- /dev/null +++ b/search/functions_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..5fca897bd0 --- /dev/null +++ b/search/functions_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_6.js b/search/functions_6.js new file mode 100644 index 0000000000..f364eb3693 --- /dev/null +++ b/search/functions_6.js @@ -0,0 +1,33 @@ +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']]], + ['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()']]], + ['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()']]], + ['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..02631a3441 --- /dev/null +++ b/search/functions_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_7.js b/search/functions_7.js new file mode 100644 index 0000000000..ee017a9347 --- /dev/null +++ b/search/functions_7.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['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.html#a9eab0207acd21f8f06ef008df2d61745',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a178ed9b62dd800979386d441ca989daf',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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']]], + ['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_watchdog_1_1_watchdog.html#a484088dd4558dd1dd9f0fbbdbb599240',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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_watchdog.html#a62c17ace3d7865490e9c0d8e492d0556',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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#afd36342d24501775cf48756d3bea8481',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['homecontroller',['HomeController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a82d77ee6d7adf13e10baf0815ad9bc7b',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..ff37095921 --- /dev/null +++ b/search/functions_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_8.js b/search/functions_8.js new file mode 100644 index 0000000000..251afbb84c --- /dev/null +++ b/search/functions_8.js @@ -0,0 +1,30 @@ +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']]], + ['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#aae94010ef435d895bb9ba3f364f025bb',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#aae94010ef435d895bb9ba3f364f025bb',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#ab516b86153bf676b7fdb67991966140e',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#a622a63b2de1299e16c06422a974e9ad5',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#a622a63b2de1299e16c06422a974e9ad5',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#a711efbb2f0ceda3aaedf3679b1f40acc',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..1d34583124 --- /dev/null +++ b/search/functions_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_9.js b/search/functions_9.js new file mode 100644 index 0000000000..80c532bc21 --- /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#a4ad9e9f0e2c8b563ced74e92016fca15',1,'Tgstation.Server.Host.Core.IJobManager.JobProgress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a2d57c5575e0567728756688920dbab40',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..8eb5e56251 --- /dev/null +++ b/search/functions_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..fa9cff56e1 --- /dev/null +++ b/search/functions_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_b.js b/search/functions_b.js new file mode 100644 index 0000000000..8c6db6561b --- /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.html#aacb3fa9c077e16c526b414cd51fb0780',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Launch()']]], + ['launchimplnolock',['LaunchImplNoLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#ab6fa199ad1a32758b21d2859501dc89f',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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..fce7a6b12d --- /dev/null +++ b/search/functions_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_c.js b/search/functions_c.js new file mode 100644 index 0000000000..c43280d941 --- /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_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)']]], + ['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_watchdog.html#a7cbe1dfd3b29d5128cea3bdffa966da8',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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..82b2b0cf81 --- /dev/null +++ b/search/functions_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_d.js b/search/functions_d.js new file mode 100644 index 0000000000..b6a0ed7bc9 --- /dev/null +++ b/search/functions_d.js @@ -0,0 +1,7 @@ +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']]] +]; diff --git a/search/functions_e.html b/search/functions_e.html new file mode 100644 index 0000000000..557ae9a446 --- /dev/null +++ b/search/functions_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..b27fb7d156 --- /dev/null +++ b/search/functions_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_f.js b/search/functions_f.js new file mode 100644 index 0000000000..13fba51027 --- /dev/null +++ b/search/functions_f.js @@ -0,0 +1,18 @@ +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']]], + ['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..81f6040a2092402b4d98f9ffa8855d12a0d4ca17 GIT binary patch literal 563 zcmV-30?hr1P)zxx&tqG15pu7)IiiXFflOc2k;dXd>%13GZAy? zRz!q0=|E6a6vV)&ZBS~G9oe0kbqyw1*gvY`{Pop2oKq#FlzgXt@Xh-7fxh>}`Fxg> z$%N%{$!4=5nM{(;=c!aG1Ofr^Do{u%Ih{^&Fc@H2)+a-?TBXrw5DW&z%Nb6mQ!L9O zl}b@6mB?f=tX3;#vl)}ggh(Vpyh(IK z(Mb0D{l{U$FsRjP;!{($+bsaaVi8T#1c0V#qEIOCYa9@UVLV`f__E81L;?WEaRA;Y zUH;rZ;vb;mk7JX|$=i3O~&If0O@oZfLg8gfIjW=dcBsz;gI=!{-r4# z4%6v$&~;q^j7Fo67yJ(NJWuX+I~I!tj^nW3?}^9bq|<3^+vapS5sgM^x7!cs(+mMT z&y%j};&~po+YO)3hoUH4E*E;e9>?R6SS&`X)p`njycAVcg{rEb41T{~Hk(bl-7eSb zmFxA2uIqo#@R?lKm50ND`~6Nfn|-b1|L6O98vt3Tx@gKz#isxO002ovPDHLkV1kyW B_l^Jn literal 0 HcmV?d00001 diff --git a/search/namespaces_0.html b/search/namespaces_0.html new file mode 100644 index 0000000000..f1b59ecc32 --- /dev/null +++ b/search/namespaces_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/namespaces_0.js b/search/namespaces_0.js new file mode 100644 index 0000000000..7de23853ab --- /dev/null +++ b/search/namespaces_0.js @@ -0,0 +1,49 @@ +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',['Components',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html',1,'Tgstation::Server::Host']]], + ['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_host_1_1_models.html',1,'Tgstation::Server::Host']]], + ['models',['Models',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html',1,'Tgstation::Server::Api']]], + ['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_host_1_1_components_1_1_byond_1_1_tests.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html',1,'Tgstation::Server::Host::Security']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_tests.html',1,'Tgstation::Server::Host']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html',1,'Tgstation::Server::Host::Watchdog']]], + ['tests',['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',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html',1,'Tgstation::Server::Host::Service']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html',1,'Tgstation::Server::Host::Core']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_client_1_1_tests.html',1,'Tgstation::Server::Client']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html',1,'Tgstation::Server::Api::Rights']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_tests.html',1,'Tgstation::Server::Api']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_tests.html',1,'Tgstation::Server']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html',1,'Tgstation::Server::Host::Console']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html',1,'Tgstation::Server::Client::Components']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html',1,'Tgstation::Server::Api::Models']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html',1,'Tgstation::Server::Host::IO']]], + ['tests',['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']]], + ['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',['Watchdog',['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html',1,'Tgstation::Server::Host']]] +]; diff --git a/search/nomatches.html b/search/nomatches.html new file mode 100644 index 0000000000..b1ded27e9a --- /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..0db7267bae --- /dev/null +++ b/search/pages_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..2c67a8ef87 --- /dev/null +++ b/search/pages_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..9cb4325f03 --- /dev/null +++ b/search/pages_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..09c8a85e57 --- /dev/null +++ b/search/properties_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_0.js b/search/properties_0.js new file mode 100644 index 0000000000..b641fa8b5a --- /dev/null +++ b/search/properties_0.js @@ -0,0 +1,34 @@ +var searchData= +[ + ['accessdenied',['AccessDenied',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#a471564a142fe17f6bc2dbfb2c0e4f490',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#a717260618bbaba0216c35ceb9838ca95',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()']]], + ['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.html#a8f9871dfdd2ebbc4350bb66fee6ae4de',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.ActiveLaunchParameters()']]], + ['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#ade2eaa5d5e27d3f550db6180e0f66b27',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()']]], + ['allowwebclient',['AllowWebClient',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#a4f0501a51f5c7b8d0e7e619fd7b549a1',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.html#ade3aa1dae110fd5b2af6de1f5f394a63',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#a8076bc5790515504427738f44c50fecd',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['apivalidationsecuritylevel',['ApiValidationSecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#a0a5255beaf799498209fa5649594aff1',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()']]], + ['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#abeff5ac1db71468960ffd0e0c4a896fd',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonSettings']]], + ['autoupdateinterval',['AutoUpdateInterval',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a940005c299f5ed5a82fc5f4fe26c190d',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#a1d16f79d0962ec9cad0ab96470f46267',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#afeea53a0f4f5663057873de51ee1cfdd',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..20723c3f8e --- /dev/null +++ b/search/properties_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_1.js b/search/properties_1.js new file mode 100644 index 0000000000..e23ffc4168 --- /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#a1b28f8bc257c1a074cf173efd0456df3',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..88b66a3528 --- /dev/null +++ b/search/properties_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_10.js b/search/properties_10.js new file mode 100644 index 0000000000..763f72c9d4 --- /dev/null +++ b/search/properties_10.js @@ -0,0 +1,24 @@ +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#ade4834de2926874e5f985b90adf32c5d',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#ac5dcb5176f0bb1f01e3276e20e024137',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()']]], + ['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()']]], + ['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#aa9c93fb71bf7a221aca3ae30aefd45f6',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#ae22eb2ec4e8b2897cb039bf86559027c',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#a9f6c25271b687235920bca188843a18d',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#ac34b3c1eaef93da5965e662cf82bac94',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#a593a83ee055518859f7cb06ba6a8c3d9',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#a4cde31c616f4ee5dd305d64d7106a3c3',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#ab7e351b9e65178222f91af2329b1d122',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..9cea9cb2a9 --- /dev/null +++ b/search/properties_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_11.js b/search/properties_11.js new file mode 100644 index 0000000000..09909c8155 --- /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#a208bd87b1345c14d9da5e89df13d965f',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..69d0e66d61 --- /dev/null +++ b/search/properties_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_12.js b/search/properties_12.js new file mode 100644 index 0000000000..415035bb78 --- /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#a990818be38def1a4d88216f8bec19106',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()']]], + ['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()']]], + ['useragent',['UserAgent',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a344ee837192b944640d63d1070ba4f2d',1,'Tgstation::Server::Api::ApiHeaders']]], + ['userid',['UserId',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#ab931666b8099bf3f765545912f07246c',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#afd98e677cc25829f046f588600f5db04',1,'Tgstation::Server::Api::Models::IrcConnectionStringBuilder']]] +]; diff --git a/search/properties_13.html b/search/properties_13.html new file mode 100644 index 0000000000..1c310a91d6 --- /dev/null +++ b/search/properties_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..ffd948c72b --- /dev/null +++ b/search/properties_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_14.js b/search/properties_14.js new file mode 100644 index 0000000000..377c9829cb --- /dev/null +++ b/search/properties_14.js @@ -0,0 +1,8 @@ +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()']]], + ['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..39cff6ce69 --- /dev/null +++ b/search/properties_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_2.js b/search/properties_2.js new file mode 100644 index 0000000000..5671306e1d --- /dev/null +++ b/search/properties_2.js @@ -0,0 +1,46 @@ +var searchData= +[ + ['cancelled',['Cancelled',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a1c5938fcf5da45fee492376d8883bf6e',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#a72e3b9af0f14b0856ec772dc97253699',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#a5a949bc37b02a109980173b1ff20399c',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()']]], + ['chatbotrights',['ChatBotRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#aebba9a7e4532e81a20267e8aef5a0c1a',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()']]], + ['compilejobconsumer',['CompileJobConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a67d79ce7c94a98f4dd7089d189f34524',1,'Tgstation::Server::Host::Components::Instance']]], + ['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#acb3c9f570b2e931a10a68704532b0bbd',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['configurationtype',['ConfigurationType',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#ab89952f2131ddba86a3f4139fb50170f',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()']]], + ['connectionstringbuilder',['ConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#ad05d53870ccf4a4f84731fe53b9c9ac5',1,'Tgstation::Server::Api::Models::Internal::ChatBot']]], + ['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#a5b61bfb463576adccbcc143775c74e17',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#a4ce8957a37fb57bfc9c668dc27d4789a',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#a31776b2e24df56f546403200b1deca44',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['currentsecurity',['CurrentSecurity',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#ae2fb4a77b5f46f2767268817d21c5543',1,'Tgstation::Server::Api::Models::DreamDaemon']]] +]; diff --git a/search/properties_3.html b/search/properties_3.html new file mode 100644 index 0000000000..68599725d3 --- /dev/null +++ b/search/properties_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_3.js b/search/properties_3.js new file mode 100644 index 0000000000..1f752492c0 --- /dev/null +++ b/search/properties_3.js @@ -0,0 +1,27 @@ +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#a611b1fe066e2d97bbc5dbf82990e9ea4',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#a4ea0be29aa3d968c39cda83f68f6d2f2',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']]], + ['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#ad77abe10668410cba5ce7d9cffae8d5f',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()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a5774569e57a7e7b15ce6dafed0904ab0',1,'Tgstation.Server.Host.Components.Instance.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#adc212b63c58ed202b097aec0e0058aa1',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..70f111b103 --- /dev/null +++ b/search/properties_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_4.js b/search/properties_4.js new file mode 100644 index 0000000000..1332c81b6b --- /dev/null +++ b/search/properties_4.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['enabled',['Enabled',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a91b36df3e83da4a8ffe59078a42daf71',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#ab52157bda4ab6e1b453b5173664293ed',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#a352a2e4fca4b6b1ee4bd4f8d85b077cd',1,'Tgstation::Server::Host::Components::Watchdog::LaunchResult']]], + ['expiresat',['ExpiresAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html#a086733898b6eace9e4955bcec93f60e0',1,'Tgstation::Server::Api::Models::Token']]] +]; diff --git a/search/properties_5.html b/search/properties_5.html new file mode 100644 index 0000000000..057019c395 --- /dev/null +++ b/search/properties_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..1ddb3add8e --- /dev/null +++ b/search/properties_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..216fe34d91 --- /dev/null +++ b/search/properties_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_7.js b/search/properties_7.js new file mode 100644 index 0000000000..81ab3f4b60 --- /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#afb31b85982da4d643b45bf3d8dfbb130',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..d9365ad7a5 --- /dev/null +++ b/search/properties_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_8.js b/search/properties_8.js new file mode 100644 index 0000000000..96b1da527c --- /dev/null +++ b/search/properties_8.js @@ -0,0 +1,28 @@ +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#aada7e9533c390909c481bccacde92809',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_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#a33c97d009719c310c8242a1ef28114d6',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#afb9b796b0c0d73c9defa7022970d2df3',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']]], + ['isadmin',['IsAdmin',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a527f796f242818b5f5b4295b5e13618f',1,'Tgstation::Server::Host::Components::Chat::Channel']]], + ['isadminchannel',['IsAdminChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a27b963c9da5483620abcda59430a40ae',1,'Tgstation::Server::Api::Models::ChatChannel']]], + ['isdirectory',['IsDirectory',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#add1f585c29f82a5c3cf51449fdd1b18a',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()']]], + ['isprivate',['IsPrivate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a6bbefb9342439c1b750972ea7a7c0eea',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#a95db5f348d8b87a14dda2f13512dc5ac',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#a70489703e160a96f7cbfce4ee3c93fca',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..47268996da --- /dev/null +++ b/search/properties_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..b1a967e37f --- /dev/null +++ b/search/properties_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_a.js b/search/properties_a.js new file mode 100644 index 0000000000..6a6c39f7a6 --- /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.html#a61de338f74feed0cb373483240b3dffd',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.LastLaunchParameters()']]], + ['lastpasswordupdate',['LastPasswordUpdate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a2e31754b4423b05b1cf70971c64f871d',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_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..8886f3a142 --- /dev/null +++ b/search/properties_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_b.js b/search/properties_b.js new file mode 100644 index 0000000000..3688bbc332 --- /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#a142a8e898772ff9f5a793e3103a8c19d',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..aee4e9336b --- /dev/null +++ b/search/properties_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_c.js b/search/properties_c.js new file mode 100644 index 0000000000..7df2e3a1b0 --- /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#a91cb81663a87f96476a47a2628ac1a86',1,'Tgstation::Server::Api::Models::TestMergeParameters']]] +]; diff --git a/search/properties_d.html b/search/properties_d.html new file mode 100644 index 0000000000..2728b73b71 --- /dev/null +++ b/search/properties_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_d.js b/search/properties_d.js new file mode 100644 index 0000000000..dddbaa9999 --- /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#ab13b7ab56475e680b571d14f7c06e52d',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..0eded63273 --- /dev/null +++ b/search/properties_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_e.js b/search/properties_e.js new file mode 100644 index 0000000000..1940dd568a --- /dev/null +++ b/search/properties_e.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['parameters',['Parameters',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#a7d2ab934fa48b76d965f0d32ba742bfa',1,'Tgstation.Server.Host.Components.Interop.ChatCommand.Parameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html#ac19cfaa2a2bda3872e42e0f6643a1811',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()']]], + ['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#af86c9cd8964c7cc3e74142f74012b501',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#a70bde9bd8b2a01b079ff0996a379081d',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#aa343d746e958dbfe2a22f4a7a4fb33cd',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#a6e727c55d5b952ece68a965c80437082',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']]], + ['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#aa81a7a474b859cbf827c4c9f5aaaa3e1',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#a4bcf9795fa6b73278d66c64809714e61',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#a2ffd7ce9d614fee77ab5d038d7b528e0',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#ae2ec2fb03329836c26cdaa3cb6b451c6',1,'Tgstation.Server.Api.Models.Job.Progress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a0f1d18fd7297e239e431009cd72d439b',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#a98b7028b546ca58d01a01376f4a85469',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#a120439ca07d4b05156cdf433eb9f22d3',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..39237c6886 --- /dev/null +++ b/search/properties_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_f.js b/search/properties_f.js new file mode 100644 index 0000000000..6d42cdd9cd --- /dev/null +++ b/search/properties_f.js @@ -0,0 +1,22 @@ +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']]], + ['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#a5b501cafa9cbacf29b84b1ef4413ea52',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_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#a2c2572f088140bfc2a3f02a70125024f',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()']]], + ['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#ae0b56fabcaa54dd916f95949914543ef',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.html#a6fe901daca4e165bc357c1e8acb20388',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Running()']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 0000000000..4d7612ff63 --- /dev/null +++ b/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + position: absolute; + float: none; + display: inline; + margin-top: 8px; + right: 0px; + width: 170px; + z-index: 102; + background-color: white; +} + +#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:111px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:0px; + 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: 1; + 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; +} + +/* ----------------------------------- */ + + +#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..dedce3bf09 --- /dev/null +++ b/search/search.js @@ -0,0 +1,791 @@ +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; ek7RCwB~R6VQOP#AvB$vH7i{6H{96zot$7cZT<7246EF5Np6N}+$IbiG6W zg#87A+NFaX+=_^xM1#gCtshC=E{%9^uQX_%?YwXvo{#q&MnpJ8uh(O?ZRc&~_1%^SsPxG@rfElJg-?U zm!Cz-IOn(qJP3kDp-^~qt+FGbl=5jNli^Wj_xIBG{Rc0en{!oFvyoNC7{V~T8}b>| z=jL2WIReZzX(YN(_9fV;BBD$VXQIxNasAL8ATvEu822WQ%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..97ee8b439687084201b79c6f776a41f495c6392a GIT binary patch literal 612 zcmV-q0-ODbP)PbXFRCwB?)W514K@j&X?z2*SxFI6-@HT2E2K=9X9%Pb zEK*!TBw&g(DMC;|A)uGlRkOS9vd-?zNs%bR4d$w+ox_iFnE8fvIvv7^5<(>Te12Li z7C)9srCzmK{ZcNM{YIl9j{DePFgOWiS%xG@5CnnnJa4nvY<^glbz7^|-ZY!dUkAwd z{gaTC@_>b5h~;ug#R0wRL0>o5!hxm*s0VW?8dr}O#zXTRTnrQm_Z7z1Mrnx>&p zD4qifUjzLvbVVWi?l?rUzwt^sdb~d!f_LEhsRVIXZtQ=qSxuxqm zEX#tf>$?M_Y1-LSDT)HqG?`%-%ZpY!#{N!rcNIiL;G7F0`l?)mNGTD9;f9F5Up3Kg zw}a<-JylhG&;=!>B+fZaCX+?C+kHYrP%c?X2!Zu_olK|GcS4A70HEy;vn)I0>0kLH z`jc(WIaaHc7!HS@f*^R^Znx8W=_jIl2oWJoQ*h1^$FX!>*PqR1J8k|fw}w_y}TpE>7m8DqDO<3z`OzXt$ccSejbEZCg@0000 + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_0.js b/search/variables_0.js new file mode 100644 index 0000000000..922c8c618d --- /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_watchdog.html#a19910ce8e445ba705ecb474d1965a5a7',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['activeparametersupdated',['activeParametersUpdated',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aecc9da4e22de8fb74d6a5821fdfbe649',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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_watchdog.html#acca61aed6e0038e5e4ef133e0e181270',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['alphaserver',['alphaServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aa8f6aa2d8051cc81ad12d087a470dee3',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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#a88beceefb17e9959124806865e6d3b2b',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#aab03c9ba9bd7a845f00bb76282d27018',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.html#a15f533f0d79587d33d5a8be1a534db04',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a6c8b6d141945660a51073287eb0c1254',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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..3c65cf264e --- /dev/null +++ b/search/variables_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_1.js b/search/variables_1.js new file mode 100644 index 0000000000..ad9f4c74b4 --- /dev/null +++ b/search/variables_1.js @@ -0,0 +1,21 @@ +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_watchdog.html#a1c27122cd40a1ca6dce7541771b02925',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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']]], + ['byondrevisionsurl',['ByondRevisionsURL',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a4754b35c4e46769dfbd68848e0cf25a6',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondRevisionsURL()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a4f049a779f2a0f9cb4df7692f0f964ca',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondRevisionsURL()']]], + ['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.html#a807567508fae94081bae2bcf76832476',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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..52b5fe87f2 --- /dev/null +++ b/search/variables_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..476f36e0f5 --- /dev/null +++ b/search/variables_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_11.js b/search/variables_11.js new file mode 100644 index 0000000000..49f86bacbb --- /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.html#aed6e0e27662e31247ac29588da0c938d',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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_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_watchdog.html#af2cfade4b1ded5fdc06086b4957f233a',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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.html#a4716774c95335450d0bb96b2ecd0908f',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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']]], + ['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.html#a8fc101bf364f77e0ba3e3fbc8d30a2e9',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.restartRegistration()']]], + ['restartrequested',['RestartRequested',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a61f844c9c2459cc3ab86153678e938db',1,'Tgstation::Server::Tests::TestingServer']]], + ['revisioninformation',['RevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#ab440b461bd435f52e1303ee74cb6115b',1,'Tgstation::Server::Host::Components::Compiler::DmbProvider']]], + ['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..ff143dcb86 --- /dev/null +++ b/search/variables_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_12.js b/search/variables_12.js new file mode 100644 index 0000000000..ec8e692d2c --- /dev/null +++ b/search/variables_12.js @@ -0,0 +1,20 @@ +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_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()']]], + ['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()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a15fd1f4732c78529f9a103a9a2303886',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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']]], + ['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_watchdog_1_1_watchdog_factory.html#a5af6c1c8d2eb3d485928e889478f0c87',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.serverControl()']]], + ['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.sessionControllerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aead92a89a941f122fb13654f25800182',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.sessionControllerFactory()']]], + ['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..f62f946fd5 --- /dev/null +++ b/search/variables_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_13.js b/search/variables_13.js new file mode 100644 index 0000000000..2166f14142 --- /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#a20c17012e5284a3b787315725fcd0a8f',1,'Tgstation::Server::Api::Rights::RightsHelper']]] +]; diff --git a/search/variables_14.html b/search/variables_14.html new file mode 100644 index 0000000000..edd9b91624 --- /dev/null +++ b/search/variables_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_14.js b/search/variables_14.js new file mode 100644 index 0000000000..ea67199946 --- /dev/null +++ b/search/variables_14.js @@ -0,0 +1,13 @@ +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']]], + ['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#ae72f8d5c9b978b0b1d7c242606965a14',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..6ee4d58a6c --- /dev/null +++ b/search/variables_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..0f264c907f --- /dev/null +++ b/search/variables_16.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_16.js b/search/variables_16.js new file mode 100644 index 0000000000..3d389ca6d5 --- /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_components_1_1_instance_factory.html#ab5bda9a81248be0498e668f2b148aa82',1,'Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a9d3a5224a3e18f775a58b31d57d2d68a',1,'Tgstation.Server.Host.Service.Program.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..7b43e0ac70 --- /dev/null +++ b/search/variables_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_2.js b/search/variables_2.js new file mode 100644 index 0000000000..7b9f94d8dd --- /dev/null +++ b/search/variables_2.js @@ -0,0 +1,40 @@ +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_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a0d7153e43face73f9fc1a32c3d5d3ae6',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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']]], + ['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']]], + ['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..ea0392dfe3 --- /dev/null +++ b/search/variables_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_3.js b/search/variables_3.js new file mode 100644 index 0000000000..35e722e9dc --- /dev/null +++ b/search/variables_3.js @@ -0,0 +1,47 @@ +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.html#aa86f5e197902ff9040ebad86aae9aa87',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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']]], + ['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()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a70e22da88b370e3539d8169e1e180a78',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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']]], + ['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_api_1_1_routes.html#acc5a1421208a8e29080110f54b364ba8',1,'Tgstation::Server::Api::Routes']]], + ['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..1ed95cb60c --- /dev/null +++ b/search/variables_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_4.js b/search/variables_4.js new file mode 100644 index 0000000000..abf9da1e67 --- /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.html#ac4126749d4e2424a415446c3ebf48aba',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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..ecc883b5cc --- /dev/null +++ b/search/variables_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..0c1a66babf --- /dev/null +++ b/search/variables_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_6.js b/search/variables_6.js new file mode 100644 index 0000000000..c0a9aa8126 --- /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_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()']]], + ['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..e0da2ef5b3 --- /dev/null +++ b/search/variables_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..0c3d1df33f --- /dev/null +++ b/search/variables_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_8.js b/search/variables_8.js new file mode 100644 index 0000000000..471edff2a6 --- /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.html#a3ba15c20184939f91f6e9d7a0fd7b4b6',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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#aa8b80c16040cf6cfaddc7d3dc2ea4b2e',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..e14a1071e3 --- /dev/null +++ b/search/variables_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_9.js b/search/variables_9.js new file mode 100644 index 0000000000..0be7908581 --- /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#a5f646af3c627f87b1d1ad93823dac1d1',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.html#a2a584a5aa2482d9633d9ce43f6f9b678',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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_api_1_1_routes.html#a85c563262244bd21fe1bfa1ce5de6a1d',1,'Tgstation.Server.Api.Routes.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()']]], + ['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#a4403f03ad002102af684e2995e8723d7',1,'Tgstation::Server::Api::ApiHeaders']]] +]; diff --git a/search/variables_a.html b/search/variables_a.html new file mode 100644 index 0000000000..4e38be7cbf --- /dev/null +++ b/search/variables_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..c98ef41d0a --- /dev/null +++ b/search/variables_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_b.js b/search/variables_b.js new file mode 100644 index 0000000000..bd44445243 --- /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#a0912c19c5d26607b99ebbe1de5249043',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_watchdog.html#a5c31f1451dc2f882f6b6f2b2de5d1802',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.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..d5f444969d --- /dev/null +++ b/search/variables_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_c.js b/search/variables_c.js new file mode 100644 index 0000000000..28cecba158 --- /dev/null +++ b/search/variables_c.js @@ -0,0 +1,10 @@ +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()']]], + ['maxmessagesize',['MaxMessageSize',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a116a4da609b283433e39d9e59187b8d4',1,'Tgstation::Server::Host::Service::ServerService']]], + ['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.html#a86ac25d930ec327fea5fd7540dd7bb71',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['monitortask',['monitorTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#af9d17410c801667ca78231f4913d1cc6',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], + ['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..a57e383b1e --- /dev/null +++ b/search/variables_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_d.js b/search/variables_d.js new file mode 100644 index 0000000000..a8cd0537a9 --- /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#acef80d9c1b4b3cf124c4e4bea9618165',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..d1502e0e53 --- /dev/null +++ b/search/variables_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
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..f777e71955 --- /dev/null +++ b/search/variables_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_f.js b/search/variables_f.js new file mode 100644 index 0000000000..8b79be4322 --- /dev/null +++ b/search/variables_f.js @@ -0,0 +1,18 @@ +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#aa5df509165231839cac7619c549d984b',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#af7860cda8ac8b343eeb747780cb22422',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#a4b142e815574ace6403bf69393ec5a3d',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()']]], + ['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_client_2_assembly_info_8cs.html b/src_2_tgstation_8_server_8_client_2_assembly_info_8cs.html new file mode 100644 index 0000000000..35298bd0dd --- /dev/null +++ b/src_2_tgstation_8_server_8_client_2_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +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/src_2_tgstation_8_server_8_client_2_assembly_info_8cs_source.html b/src_2_tgstation_8_server_8_client_2_assembly_info_8cs_source.html new file mode 100644 index 0000000000..5ea513f5cb --- /dev/null +++ b/src_2_tgstation_8_server_8_client_2_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +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/src_2_tgstation_8_server_8_host_2_assembly_info_8cs.html b/src_2_tgstation_8_server_8_host_2_assembly_info_8cs.html new file mode 100644 index 0000000000..dfd060facf --- /dev/null +++ b/src_2_tgstation_8_server_8_host_2_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +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/src_2_tgstation_8_server_8_host_2_assembly_info_8cs_source.html b/src_2_tgstation_8_server_8_host_2_assembly_info_8cs_source.html new file mode 100644 index 0000000000..53064ae37d --- /dev/null +++ b/src_2_tgstation_8_server_8_host_2_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +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/src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html b/src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html new file mode 100644 index 0000000000..95000901d9 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +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/src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html b/src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html new file mode 100644 index 0000000000..d67f60b3bb --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +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/src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html b/src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html new file mode 100644 index 0000000000..8d0a1d8906 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +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/src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html b/src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html new file mode 100644 index 0000000000..f2eaa91d55 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +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.Reflection;
2 using System.Runtime.CompilerServices;
3 using System.Runtime.InteropServices;
4 
5 [assembly: AssemblyTitle("Tgstation.Server.Host.Service")]
6 [assembly: ComVisible(false)]
7 [assembly: Guid("29927416-3b78-49a7-a560-5ccaa638b6b4")]
8 [assembly: InternalsVisibleTo("Tgstation.Server.Host.Service.Tests")]
9 
10 [assembly: AssemblyVersion("4.0.1.3")]
11 [assembly: AssemblyFileVersion("4.0.1.3")]
+
+ + + + diff --git a/src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html b/src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html new file mode 100644 index 0000000000..ed1928c7ff --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +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/src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html b/src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html new file mode 100644 index 0000000000..730f8b45dd --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +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/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..9cf578f23a --- /dev/null +++ b/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs.html b/tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs.html new file mode 100644 index 0000000000..df0c806d6a --- /dev/null +++ b/tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs.html @@ -0,0 +1,105 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/Properties/AssemblyInfo.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs_source.html b/tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs_source.html new file mode 100644 index 0000000000..4050ec5efc --- /dev/null +++ b/tests_2_tgstation_8_server_8_host_8_service_8_tests_2_properties_2_assembly_info_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/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.Reflection;
2 using System.Runtime.InteropServices;
3 
4 [assembly: AssemblyTitle("Tgstation.Server.Host.Service.Tests")]
5 [assembly: ComVisible(false)]
6 
7 [assembly: Guid("aa80a190-52e2-4be3-bfeb-1f148d9e9007")]
8 
9 [assembly: AssemblyVersion("4.0.0.0")]
10 [assembly: AssemblyFileVersion("4.0.0.0")]
11 [assembly: AssemblyInformationalVersion("4.0.0.0")]
+
+ + + + 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