Repository: heroiclabs/nakama-dotnet
Branch: master
Commit: 6a51c8fd90a7
Files: 1862
Total size: 12.8 MB
Directory structure:
gitextract_98wg7jk9/
├── .editorconfig
├── .github/
│ └── workflows/
│ ├── doxygen.yml
│ └── pr.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── Nakama/
│ ├── ApiClient.gen.cs
│ ├── ChannelJoinMessage.cs
│ ├── ChannelLeaveMessage.cs
│ ├── ChannelRemoveMessage.cs
│ ├── ChannelSendMessage.cs
│ ├── ChannelUpdateMessage.cs
│ ├── Client.cs
│ ├── Console/
│ │ └── ConsoleClient.gen.cs
│ ├── GZipHttpClientHandler.cs
│ ├── HttpRequestAdapter.cs
│ ├── IChannel.cs
│ ├── IChannelMessageAck.cs
│ ├── IChannelPresenceEvent.cs
│ ├── IClient.cs
│ ├── IHttpAdapter.cs
│ ├── IHttpAdapterUtil.cs
│ ├── ILogger.cs
│ ├── IMatch.cs
│ ├── IMatchPresenceEvent.cs
│ ├── IMatchState.cs
│ ├── IMatchmakerMatched.cs
│ ├── IMatchmakerTicket.cs
│ ├── IParty.cs
│ ├── IPartyClose.cs
│ ├── IPartyData.cs
│ ├── IPartyJoinRequest.cs
│ ├── IPartyLeader.cs
│ ├── IPartyMatchmakerTicket.cs
│ ├── IPartyPresenceEvent.cs
│ ├── IPartyUpdate.cs
│ ├── ISession.cs
│ ├── ISocket.cs
│ ├── ISocketAdapter.cs
│ ├── IStatus.cs
│ ├── IStatusPresenceEvent.cs
│ ├── IStreamPresenceEvent.cs
│ ├── IUserPresence.cs
│ ├── MatchCreateMessage.cs
│ ├── MatchJoinMessage.cs
│ ├── MatchLeaveMessage.cs
│ ├── MatchSendMessage.cs
│ ├── MatchmakerAddMessage.cs
│ ├── MatchmakerRemoveMessage.cs
│ ├── Nakama.csproj
│ ├── Ninja.WebSockets/
│ │ ├── BufferPool.cs
│ │ ├── Exceptions/
│ │ │ ├── EntityTooLargeException.cs
│ │ │ ├── InvalidHttpResponseCodeException.cs
│ │ │ ├── README.txt
│ │ │ ├── SecWebSocketKeyMissingException.cs
│ │ │ ├── ServerListenerSocketException.cs
│ │ │ ├── WebSocketBufferOverflowException.cs
│ │ │ ├── WebSocketHandshakeFailedException.cs
│ │ │ └── WebSocketVersionNotSupportedException.cs
│ │ ├── HttpHelper.cs
│ │ ├── IBufferPool.cs
│ │ ├── IPingPongManager.cs
│ │ ├── IWebSocketClientFactory.cs
│ │ ├── IWebSocketServerFactory.cs
│ │ ├── Internal/
│ │ │ ├── BinaryReaderWriter.cs
│ │ │ ├── WebSocketFrame.cs
│ │ │ ├── WebSocketFrameCommon.cs
│ │ │ ├── WebSocketFrameReader.cs
│ │ │ ├── WebSocketFrameWriter.cs
│ │ │ ├── WebSocketImplementation.cs
│ │ │ ├── WebSocketOpCode.cs
│ │ │ └── WebSocketReadCursor.cs
│ │ ├── LICENCE
│ │ ├── PingPongManager.cs
│ │ ├── PongEventArgs.cs
│ │ ├── WebSocketClientFactory.cs
│ │ ├── WebSocketClientOptions.cs
│ │ ├── WebSocketHttpContext.cs
│ │ ├── WebSocketServerFactory.cs
│ │ └── WebSocketServerOptions.cs
│ ├── NullLogger.cs
│ ├── Party.cs
│ ├── PartyAccept.cs
│ ├── PartyClose.cs
│ ├── PartyCreate.cs
│ ├── PartyData.cs
│ ├── PartyDataSend.cs
│ ├── PartyJoin.cs
│ ├── PartyJoinRequest.cs
│ ├── PartyJoinRequestList.cs
│ ├── PartyLeader.cs
│ ├── PartyLeave.cs
│ ├── PartyMatchmakerAdd.cs
│ ├── PartyMatchmakerRemove.cs
│ ├── PartyMatchmakerTicket.cs
│ ├── PartyMemberRemove.cs
│ ├── PartyPresenceEvent.cs
│ ├── PartyPromote.cs
│ ├── PartyUpdate.cs
│ ├── PresenceUtil.cs
│ ├── PreserveAttribute.cs
│ ├── Retry.cs
│ ├── RetryConfiguration.cs
│ ├── RetryHistory.cs
│ ├── RetryInvoker.cs
│ ├── RetryJitter.cs
│ ├── RetryListener.cs
│ ├── Session.cs
│ ├── Socket.cs
│ ├── StatusFollowMessage.cs
│ ├── StatusUnfollowMessage.cs
│ ├── StatusUpdateMessage.cs
│ ├── StorageObjectId.cs
│ ├── TinyJson/
│ │ ├── JsonParser.cs
│ │ ├── JsonWriter.cs
│ │ └── LICENSE
│ ├── TransientExceptionDelegate.cs
│ ├── WebSocketAdapter.cs
│ ├── WebSocketErrorMessage.cs
│ ├── WebSocketMessageEnvelope.cs
│ ├── WebSocketStdlibAdapter.cs
│ └── WriteStorageObject.cs
├── Nakama.Tests/
│ ├── AssemblyInfo.cs
│ ├── AuthenticateTest.cs
│ ├── AwaitedSocketTaskTest.cs
│ ├── CancelTest.cs
│ ├── FriendTest.cs
│ ├── GroupTest.cs
│ ├── HttpErrorTest.cs
│ ├── LeaderboardAroundOwnerTest.cs
│ ├── LeaderboardTest.cs
│ ├── LinkUnlinkTest.cs
│ ├── Nakama.Tests.csproj
│ ├── PresenceUtilTest.cs
│ ├── RetryTest.cs
│ ├── RpcTest.cs
│ ├── SessionTest.cs
│ ├── Socket/
│ │ ├── WebSocketChannelTest.cs
│ │ ├── WebSocketMatchTest.cs
│ │ ├── WebSocketMatchmakerTest.cs
│ │ ├── WebSocketNotificationTest.cs
│ │ ├── WebSocketPartyTest.cs
│ │ ├── WebSocketRpcTest.cs
│ │ ├── WebSocketTest.cs
│ │ └── WebSocketUserStatusTest.cs
│ ├── StdoutLogger.cs
│ ├── TestsUtil.cs
│ ├── TinyJsonParserTest.cs
│ ├── TransientExceptionHttpAdapter.cs
│ └── settings.json
├── Nakama.sln
├── README.md
├── RELEASEINST.md
├── Satori/
│ ├── ApiClient.gen.cs
│ ├── Client.cs
│ ├── Console/
│ │ └── ConsoleClient.gen.cs
│ ├── Event.cs
│ ├── GZipHttpClientHandler.cs
│ ├── HttpRequestAdapter.cs
│ ├── IClient.cs
│ ├── IHttpAdapter.cs
│ ├── IHttpAdapterUtil.cs
│ ├── ILogger.cs
│ ├── ISession.cs
│ ├── NullLogger.cs
│ ├── PreserveAttribute.cs
│ ├── Retry.cs
│ ├── RetryConfiguration.cs
│ ├── RetryHistory.cs
│ ├── RetryInvoker.cs
│ ├── RetryJitter.cs
│ ├── RetryListener.cs
│ ├── Satori.csproj
│ ├── Session.cs
│ ├── TinyJson/
│ │ ├── JsonParser.cs
│ │ ├── JsonWriter.cs
│ │ └── LICENSE
│ └── TransientExceptionDelegate.cs
├── Satori.Tests/
│ ├── ClientIdentifyTest.cs
│ ├── ClientTest.cs
│ ├── README.md
│ └── Satori.Tests.csproj
├── Taskfile.dist.yml
├── codegen/
│ ├── README.md
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── docs/
├── .nojekyll
├── CNAME
├── Doxyfile
├── html/
│ ├── _api_client_8gen_8cs.html
│ ├── _api_client_8gen_8cs.js
│ ├── _binary_reader_writer_8cs.html
│ ├── _buffer_pool_8cs.html
│ ├── _buffer_pool_8cs.js
│ ├── _c_h_a_n_g_e_l_o_g_8md.html
│ ├── _channel_join_message_8cs.html
│ ├── _channel_join_message_8cs.js
│ ├── _channel_leave_message_8cs.html
│ ├── _channel_remove_message_8cs.html
│ ├── _channel_send_message_8cs.html
│ ├── _channel_update_message_8cs.html
│ ├── _client_8cs.html
│ ├── _client_8cs.js
│ ├── _console_client_8gen_8cs.html
│ ├── _console_client_8gen_8cs.js
│ ├── _debug_2net46_2_8_n_e_t_framework_00_version_0av4_86_8_assembly_attributes_8cs.html
│ ├── _debug_2net46_2_nakama_8_assembly_info_8cs.html
│ ├── _debug_2net46_2_satori_8_assembly_info_8cs.html
│ ├── _debug_2netstandard2_80_2_8_n_e_t_standard_00_version_0av2_80_8_assembly_attributes_8cs.html
│ ├── _debug_2netstandard2_80_2_nakama_8_assembly_info_8cs.html
│ ├── _debug_2netstandard2_80_2_satori_8_assembly_info_8cs.html
│ ├── _debug_2netstandard2_81_2_nakama_8_assembly_info_8cs.html
│ ├── _debug_2netstandard2_81_2_satori_8_assembly_info_8cs.html
│ ├── _entity_too_large_exception_8cs.html
│ ├── _entity_too_large_exception_8cs.js
│ ├── _event_8cs.html
│ ├── _event_8cs.js
│ ├── _g_zip_http_client_handler_8cs.html
│ ├── _http_helper_8cs.html
│ ├── _http_helper_8cs.js
│ ├── _http_request_adapter_8cs.html
│ ├── _http_request_adapter_8cs.js
│ ├── _i_buffer_pool_8cs.html
│ ├── _i_buffer_pool_8cs.js
│ ├── _i_channel_8cs.html
│ ├── _i_channel_8cs.js
│ ├── _i_channel_message_ack_8cs.html
│ ├── _i_channel_message_ack_8cs.js
│ ├── _i_channel_presence_event_8cs.html
│ ├── _i_channel_presence_event_8cs.js
│ ├── _i_client_8cs.html
│ ├── _i_client_8cs.js
│ ├── _i_http_adapter_8cs.html
│ ├── _i_http_adapter_8cs.js
│ ├── _i_http_adapter_util_8cs.html
│ ├── _i_logger_8cs.html
│ ├── _i_logger_8cs.js
│ ├── _i_match_8cs.html
│ ├── _i_match_8cs.js
│ ├── _i_match_presence_event_8cs.html
│ ├── _i_match_presence_event_8cs.js
│ ├── _i_match_state_8cs.html
│ ├── _i_match_state_8cs.js
│ ├── _i_matchmaker_matched_8cs.html
│ ├── _i_matchmaker_matched_8cs.js
│ ├── _i_matchmaker_ticket_8cs.html
│ ├── _i_matchmaker_ticket_8cs.js
│ ├── _i_party_8cs.html
│ ├── _i_party_8cs.js
│ ├── _i_party_close_8cs.html
│ ├── _i_party_close_8cs.js
│ ├── _i_party_data_8cs.html
│ ├── _i_party_data_8cs.js
│ ├── _i_party_join_request_8cs.html
│ ├── _i_party_join_request_8cs.js
│ ├── _i_party_leader_8cs.html
│ ├── _i_party_leader_8cs.js
│ ├── _i_party_matchmaker_ticket_8cs.html
│ ├── _i_party_matchmaker_ticket_8cs.js
│ ├── _i_party_presence_event_8cs.html
│ ├── _i_party_presence_event_8cs.js
│ ├── _i_party_update_8cs.html
│ ├── _i_party_update_8cs.js
│ ├── _i_ping_pong_manager_8cs.html
│ ├── _i_ping_pong_manager_8cs.js
│ ├── _i_session_8cs.html
│ ├── _i_session_8cs.js
│ ├── _i_socket_8cs.html
│ ├── _i_socket_8cs.js
│ ├── _i_socket_adapter_8cs.html
│ ├── _i_socket_adapter_8cs.js
│ ├── _i_status_8cs.html
│ ├── _i_status_8cs.js
│ ├── _i_status_presence_event_8cs.html
│ ├── _i_status_presence_event_8cs.js
│ ├── _i_stream_presence_event_8cs.html
│ ├── _i_stream_presence_event_8cs.js
│ ├── _i_user_presence_8cs.html
│ ├── _i_user_presence_8cs.js
│ ├── _i_web_socket_client_factory_8cs.html
│ ├── _i_web_socket_client_factory_8cs.js
│ ├── _i_web_socket_server_factory_8cs.html
│ ├── _i_web_socket_server_factory_8cs.js
│ ├── _invalid_http_response_code_exception_8cs.html
│ ├── _invalid_http_response_code_exception_8cs.js
│ ├── _json_parser_8cs.html
│ ├── _json_writer_8cs.html
│ ├── _match_create_message_8cs.html
│ ├── _match_join_message_8cs.html
│ ├── _match_leave_message_8cs.html
│ ├── _match_send_message_8cs.html
│ ├── _matchmaker_add_message_8cs.html
│ ├── _matchmaker_remove_message_8cs.html
│ ├── _nakama_2_api_client_8gen_8cs.html
│ ├── _nakama_2_api_client_8gen_8cs.js
│ ├── _nakama_2_client_8cs.html
│ ├── _nakama_2_client_8cs.js
│ ├── _nakama_2_g_zip_http_client_handler_8cs.html
│ ├── _nakama_2_http_request_adapter_8cs.html
│ ├── _nakama_2_http_request_adapter_8cs.js
│ ├── _nakama_2_i_client_8cs.html
│ ├── _nakama_2_i_client_8cs.js
│ ├── _nakama_2_i_http_adapter_8cs.html
│ ├── _nakama_2_i_http_adapter_8cs.js
│ ├── _nakama_2_i_http_adapter_util_8cs.html
│ ├── _nakama_2_i_logger_8cs.html
│ ├── _nakama_2_i_logger_8cs.js
│ ├── _nakama_2_i_session_8cs.html
│ ├── _nakama_2_i_session_8cs.js
│ ├── _nakama_2_preserve_attribute_8cs.html
│ ├── _nakama_2_retry_8cs.html
│ ├── _nakama_2_retry_8cs.js
│ ├── _nakama_2_retry_configuration_8cs.html
│ ├── _nakama_2_retry_configuration_8cs.js
│ ├── _nakama_2_retry_history_8cs.html
│ ├── _nakama_2_retry_invoker_8cs.html
│ ├── _nakama_2_retry_jitter_8cs.html
│ ├── _nakama_2_retry_jitter_8cs.js
│ ├── _nakama_2_retry_listener_8cs.html
│ ├── _nakama_2_retry_listener_8cs.js
│ ├── _nakama_2_session_8cs.html
│ ├── _nakama_2_session_8cs.js
│ ├── _nakama_2_tiny_json_2_json_parser_8cs.html
│ ├── _nakama_2_tiny_json_2_json_writer_8cs.html
│ ├── _nakama_2_transient_exception_delegate_8cs.html
│ ├── _nakama_2_transient_exception_delegate_8cs.js
│ ├── _nakama_2obj_2_debug_2net46_2_8_n_e_t_framework_00_version_0av4_86_8_assembly_attributes_8cs.html
│ ├── _nakama_2obj_2_debug_2netstandard2_80_2_8_n_e_t_standard_00_version_0av2_80_8_assembly_attributes_8cs.html
│ ├── _nakama_2obj_2_debug_2netstandard2_81_2_8_n_e_t_standard_00_version_0av2_81_8_assembly_attributes_8cs.html
│ ├── _nakama_2obj_2_release_2net46_2_8_n_e_t_framework_00_version_0av4_86_8_assembly_attributes_8cs.html
│ ├── _nakama_2obj_2_release_2netstandard2_80_2_8_n_e_t_standard_00_version_0av2_80_8_assembly_attributes_8cs.html
│ ├── _nakama_2obj_2_release_2netstandard2_81_2_8_n_e_t_standard_00_version_0av2_81_8_assembly_attributes_8cs.html
│ ├── _null_logger_8cs.html
│ ├── _party_8cs.html
│ ├── _party_accept_8cs.html
│ ├── _party_close_8cs.html
│ ├── _party_create_8cs.html
│ ├── _party_data_8cs.html
│ ├── _party_data_send_8cs.html
│ ├── _party_join_8cs.html
│ ├── _party_join_request_8cs.html
│ ├── _party_join_request_list_8cs.html
│ ├── _party_leader_8cs.html
│ ├── _party_leave_8cs.html
│ ├── _party_matchmaker_add_8cs.html
│ ├── _party_matchmaker_remove_8cs.html
│ ├── _party_matchmaker_ticket_8cs.html
│ ├── _party_member_remove_8cs.html
│ ├── _party_presence_event_8cs.html
│ ├── _party_promote_8cs.html
│ ├── _party_update_8cs.html
│ ├── _ping_pong_manager_8cs.html
│ ├── _ping_pong_manager_8cs.js
│ ├── _pong_event_args_8cs.html
│ ├── _pong_event_args_8cs.js
│ ├── _presence_util_8cs.html
│ ├── _preserve_attribute_8cs.html
│ ├── _r_e_a_d_m_e_8md.html
│ ├── _release_2net46_2_8_n_e_t_framework_00_version_0av4_86_8_assembly_attributes_8cs.html
│ ├── _release_2net46_2_nakama_8_assembly_info_8cs.html
│ ├── _release_2net46_2_satori_8_assembly_info_8cs.html
│ ├── _release_2netstandard2_80_2_8_n_e_t_standard_00_version_0av2_80_8_assembly_attributes_8cs.html
│ ├── _release_2netstandard2_80_2_nakama_8_assembly_info_8cs.html
│ ├── _release_2netstandard2_80_2_satori_8_assembly_info_8cs.html
│ ├── _release_2netstandard2_81_2_nakama_8_assembly_info_8cs.html
│ ├── _release_2netstandard2_81_2_satori_8_assembly_info_8cs.html
│ ├── _retry_8cs.html
│ ├── _retry_8cs.js
│ ├── _retry_configuration_8cs.html
│ ├── _retry_configuration_8cs.js
│ ├── _retry_history_8cs.html
│ ├── _retry_invoker_8cs.html
│ ├── _retry_jitter_8cs.html
│ ├── _retry_jitter_8cs.js
│ ├── _retry_listener_8cs.html
│ ├── _retry_listener_8cs.js
│ ├── _satori_2_api_client_8gen_8cs.html
│ ├── _satori_2_api_client_8gen_8cs.js
│ ├── _satori_2_client_8cs.html
│ ├── _satori_2_client_8cs.js
│ ├── _satori_2_g_zip_http_client_handler_8cs.html
│ ├── _satori_2_http_request_adapter_8cs.html
│ ├── _satori_2_http_request_adapter_8cs.js
│ ├── _satori_2_i_client_8cs.html
│ ├── _satori_2_i_client_8cs.js
│ ├── _satori_2_i_http_adapter_8cs.html
│ ├── _satori_2_i_http_adapter_8cs.js
│ ├── _satori_2_i_http_adapter_util_8cs.html
│ ├── _satori_2_i_logger_8cs.html
│ ├── _satori_2_i_logger_8cs.js
│ ├── _satori_2_i_session_8cs.html
│ ├── _satori_2_i_session_8cs.js
│ ├── _satori_2_preserve_attribute_8cs.html
│ ├── _satori_2_retry_8cs.html
│ ├── _satori_2_retry_8cs.js
│ ├── _satori_2_retry_configuration_8cs.html
│ ├── _satori_2_retry_configuration_8cs.js
│ ├── _satori_2_retry_history_8cs.html
│ ├── _satori_2_retry_invoker_8cs.html
│ ├── _satori_2_retry_jitter_8cs.html
│ ├── _satori_2_retry_jitter_8cs.js
│ ├── _satori_2_retry_listener_8cs.html
│ ├── _satori_2_retry_listener_8cs.js
│ ├── _satori_2_session_8cs.html
│ ├── _satori_2_session_8cs.js
│ ├── _satori_2_tiny_json_2_json_parser_8cs.html
│ ├── _satori_2_tiny_json_2_json_writer_8cs.html
│ ├── _satori_2_transient_exception_delegate_8cs.html
│ ├── _satori_2_transient_exception_delegate_8cs.js
│ ├── _satori_2obj_2_debug_2net46_2_8_n_e_t_framework_00_version_0av4_86_8_assembly_attributes_8cs.html
│ ├── _satori_2obj_2_debug_2netstandard2_80_2_8_n_e_t_standard_00_version_0av2_80_8_assembly_attributes_8cs.html
│ ├── _satori_2obj_2_debug_2netstandard2_81_2_8_n_e_t_standard_00_version_0av2_81_8_assembly_attributes_8cs.html
│ ├── _satori_2obj_2_release_2net46_2_8_n_e_t_framework_00_version_0av4_86_8_assembly_attributes_8cs.html
│ ├── _satori_2obj_2_release_2netstandard2_80_2_8_n_e_t_standard_00_version_0av2_80_8_assembly_attributes_8cs.html
│ ├── _satori_2obj_2_release_2netstandard2_81_2_8_n_e_t_standard_00_version_0av2_81_8_assembly_attributes_8cs.html
│ ├── _sec_web_socket_key_missing_exception_8cs.html
│ ├── _sec_web_socket_key_missing_exception_8cs.js
│ ├── _server_listener_socket_exception_8cs.html
│ ├── _server_listener_socket_exception_8cs.js
│ ├── _session_8cs.html
│ ├── _session_8cs.js
│ ├── _socket_8cs.html
│ ├── _socket_8cs.js
│ ├── _status_follow_message_8cs.html
│ ├── _status_unfollow_message_8cs.html
│ ├── _status_update_message_8cs.html
│ ├── _storage_object_id_8cs.html
│ ├── _storage_object_id_8cs.js
│ ├── _transient_exception_delegate_8cs.html
│ ├── _transient_exception_delegate_8cs.js
│ ├── _web_socket_adapter_8cs.html
│ ├── _web_socket_adapter_8cs.js
│ ├── _web_socket_buffer_overflow_exception_8cs.html
│ ├── _web_socket_buffer_overflow_exception_8cs.js
│ ├── _web_socket_client_factory_8cs.html
│ ├── _web_socket_client_factory_8cs.js
│ ├── _web_socket_client_options_8cs.html
│ ├── _web_socket_client_options_8cs.js
│ ├── _web_socket_error_message_8cs.html
│ ├── _web_socket_frame_8cs.html
│ ├── _web_socket_frame_common_8cs.html
│ ├── _web_socket_frame_reader_8cs.html
│ ├── _web_socket_frame_writer_8cs.html
│ ├── _web_socket_handshake_failed_exception_8cs.html
│ ├── _web_socket_handshake_failed_exception_8cs.js
│ ├── _web_socket_http_context_8cs.html
│ ├── _web_socket_http_context_8cs.js
│ ├── _web_socket_implementation_8cs.html
│ ├── _web_socket_message_envelope_8cs.html
│ ├── _web_socket_op_code_8cs.html
│ ├── _web_socket_read_cursor_8cs.html
│ ├── _web_socket_server_factory_8cs.html
│ ├── _web_socket_server_factory_8cs.js
│ ├── _web_socket_server_options_8cs.html
│ ├── _web_socket_server_options_8cs.js
│ ├── _web_socket_stdlib_adapter_8cs.html
│ ├── _web_socket_stdlib_adapter_8cs.js
│ ├── _web_socket_version_not_supported_exception_8cs.html
│ ├── _web_socket_version_not_supported_exception_8cs.js
│ ├── _write_storage_object_8cs.html
│ ├── _write_storage_object_8cs.js
│ ├── annotated.html
│ ├── annotated_dup.js
│ ├── class_nakama_1_1_api_response_exception-members.html
│ ├── class_nakama_1_1_api_response_exception.html
│ ├── class_nakama_1_1_api_response_exception.js
│ ├── class_nakama_1_1_client-members.html
│ ├── class_nakama_1_1_client.html
│ ├── class_nakama_1_1_client.js
│ ├── class_nakama_1_1_console_1_1_api_response_exception-members.html
│ ├── class_nakama_1_1_console_1_1_api_response_exception.html
│ ├── class_nakama_1_1_console_1_1_api_response_exception.js
│ ├── class_nakama_1_1_http_request_adapter-members.html
│ ├── class_nakama_1_1_http_request_adapter.html
│ ├── class_nakama_1_1_http_request_adapter.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool_1_1_public_buffer_memory_stream-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool_1_1_public_buffer_memory_stream.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool_1_1_public_buffer_memory_stream.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_entity_too_large_exception-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_entity_too_large_exception.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_entity_too_large_exception.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_invalid_http_response_code_exception-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_invalid_http_response_code_exception.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_invalid_http_response_code_exception.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_sec_web_socket_key_missing_exception-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_sec_web_socket_key_missing_exception.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_sec_web_socket_key_missing_exception.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_server_listener_socket_exception-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_server_listener_socket_exception.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_server_listener_socket_exception.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_buffer_overflow_exception-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_buffer_overflow_exception.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_buffer_overflow_exception.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_handshake_failed_exception-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_handshake_failed_exception.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_handshake_failed_exception.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_version_not_supported_exception-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_version_not_supported_exception.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_version_not_supported_exception.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_http_helper-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_http_helper.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_ping_pong_manager-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_ping_pong_manager.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_ping_pong_manager.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_pong_event_args-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_pong_event_args.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_pong_event_args.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_factory-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_factory.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_factory.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_options-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_options.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_options.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_http_context-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_http_context.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_http_context.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_factory-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_factory.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_factory.js
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_options-members.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_options.html
│ ├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_options.js
│ ├── class_nakama_1_1_retry-members.html
│ ├── class_nakama_1_1_retry.html
│ ├── class_nakama_1_1_retry.js
│ ├── class_nakama_1_1_retry_configuration-members.html
│ ├── class_nakama_1_1_retry_configuration.html
│ ├── class_nakama_1_1_retry_configuration.js
│ ├── class_nakama_1_1_session-members.html
│ ├── class_nakama_1_1_session.html
│ ├── class_nakama_1_1_session.js
│ ├── class_nakama_1_1_socket-members.html
│ ├── class_nakama_1_1_socket.html
│ ├── class_nakama_1_1_socket.js
│ ├── class_nakama_1_1_storage_object_id-members.html
│ ├── class_nakama_1_1_storage_object_id.html
│ ├── class_nakama_1_1_storage_object_id.js
│ ├── class_nakama_1_1_tests_1_1_api_1_1_authenticate_test-members.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_authenticate_test.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_group_test-members.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_group_test.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_http_error_test-members.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_http_error_test.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_around_owner_test-members.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_around_owner_test.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_test-members.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_test.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_link_unlink_test-members.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_link_unlink_test.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_rpc_test-members.html
│ ├── class_nakama_1_1_tests_1_1_api_1_1_rpc_test.html
│ ├── class_nakama_1_1_tests_1_1_awaited_socket_task_test-members.html
│ ├── class_nakama_1_1_tests_1_1_awaited_socket_task_test.html
│ ├── class_nakama_1_1_tests_1_1_cancel_test-members.html
│ ├── class_nakama_1_1_tests_1_1_cancel_test.html
│ ├── class_nakama_1_1_tests_1_1_retry_test-members.html
│ ├── class_nakama_1_1_tests_1_1_retry_test.html
│ ├── class_nakama_1_1_tests_1_1_session_test-members.html
│ ├── class_nakama_1_1_tests_1_1_session_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_channel_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_channel_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_match_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_match_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_matchmaker_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_matchmaker_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_notification_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_notification_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_party_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_party_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_rpc_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_rpc_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_test.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_user_status_test-members.html
│ ├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_user_status_test.html
│ ├── class_nakama_1_1_tests_1_1_stdout_logger-members.html
│ ├── class_nakama_1_1_tests_1_1_stdout_logger.html
│ ├── class_nakama_1_1_tests_1_1_stdout_logger.js
│ ├── class_nakama_1_1_tests_1_1_tiny_json_parser_test-members.html
│ ├── class_nakama_1_1_tests_1_1_tiny_json_parser_test.html
│ ├── class_nakama_1_1_tests_1_1_transient_exception_http_adapter-members.html
│ ├── class_nakama_1_1_tests_1_1_transient_exception_http_adapter.html
│ ├── class_nakama_1_1_tests_1_1_transient_exception_http_adapter.js
│ ├── class_nakama_1_1_web_socket_adapter-members.html
│ ├── class_nakama_1_1_web_socket_adapter.html
│ ├── class_nakama_1_1_web_socket_adapter.js
│ ├── class_nakama_1_1_web_socket_stdlib_adapter-members.html
│ ├── class_nakama_1_1_web_socket_stdlib_adapter.html
│ ├── class_nakama_1_1_web_socket_stdlib_adapter.js
│ ├── class_nakama_1_1_write_storage_object-members.html
│ ├── class_nakama_1_1_write_storage_object.html
│ ├── class_nakama_1_1_write_storage_object.js
│ ├── class_satori_1_1_api_response_exception-members.html
│ ├── class_satori_1_1_api_response_exception.html
│ ├── class_satori_1_1_api_response_exception.js
│ ├── class_satori_1_1_client-members.html
│ ├── class_satori_1_1_client.html
│ ├── class_satori_1_1_client.js
│ ├── class_satori_1_1_event-members.html
│ ├── class_satori_1_1_event.html
│ ├── class_satori_1_1_event.js
│ ├── class_satori_1_1_http_request_adapter-members.html
│ ├── class_satori_1_1_http_request_adapter.html
│ ├── class_satori_1_1_http_request_adapter.js
│ ├── class_satori_1_1_retry-members.html
│ ├── class_satori_1_1_retry.html
│ ├── class_satori_1_1_retry.js
│ ├── class_satori_1_1_retry_configuration-members.html
│ ├── class_satori_1_1_retry_configuration.html
│ ├── class_satori_1_1_retry_configuration.js
│ ├── class_satori_1_1_session-members.html
│ ├── class_satori_1_1_session.html
│ ├── class_satori_1_1_session.js
│ ├── class_satori_1_1_tests_1_1_client_test-members.html
│ ├── class_satori_1_1_tests_1_1_client_test.html
│ ├── classes.html
│ ├── clipboard.js
│ ├── cookie.js
│ ├── dir_00db1776877a30bd47a3324e3b896815.html
│ ├── dir_00db1776877a30bd47a3324e3b896815.js
│ ├── dir_0255d041b3ce7964bcd7b11954959c22.html
│ ├── dir_0385b7cc93c13096276fd0475bf94138.html
│ ├── dir_0385b7cc93c13096276fd0475bf94138.js
│ ├── dir_07d4e60c212e220cb70fd11bc65ff95e.html
│ ├── dir_0a71ed179ba9d4357fa1a0aa4e188f77.html
│ ├── dir_0a71ed179ba9d4357fa1a0aa4e188f77.js
│ ├── dir_0acaa047c55e3bbc2ca6716743379b50.html
│ ├── dir_104e9d364d598921197c06c38fc2275c.html
│ ├── dir_1c3008a3c461c137d9f062e2a28e5366.html
│ ├── dir_1c3008a3c461c137d9f062e2a28e5366.js
│ ├── dir_2024f50217af71df819eb31c540cc957.html
│ ├── dir_2024f50217af71df819eb31c540cc957.js
│ ├── dir_223f41b9d4a3aed2d0cd2a771bf2b672.html
│ ├── dir_29bd9dc1cd33dca2d02be697ebc424d5.html
│ ├── dir_29bd9dc1cd33dca2d02be697ebc424d5.js
│ ├── dir_2c78f4ea1566149e6f1239d9a2bbc92d.html
│ ├── dir_2c78f4ea1566149e6f1239d9a2bbc92d.js
│ ├── dir_3771c35781cb72be820bcf0859828876.html
│ ├── dir_40821ca9aa8b0024c09c9271c75bfc8d.html
│ ├── dir_4aba2f75ac06c997db6dcdd45b346bfc.html
│ ├── dir_4aba2f75ac06c997db6dcdd45b346bfc.js
│ ├── dir_4d6966d1911ef40af05228884f817f01.html
│ ├── dir_509efb472faf656a1f9c1c002f3dfbd0.html
│ ├── dir_59425e443f801f1f2fd8bbe4959a3ccf.html
│ ├── dir_5986fb63ee1c250c22ec7255d2796bed.html
│ ├── dir_5986fb63ee1c250c22ec7255d2796bed.js
│ ├── dir_5a43296f26836228c3ddbf8578e994aa.html
│ ├── dir_5a43296f26836228c3ddbf8578e994aa.js
│ ├── dir_5c537d2b32ff2d13d00336fbe6131750.html
│ ├── dir_5c537d2b32ff2d13d00336fbe6131750.js
│ ├── dir_5d1450713377add98c1180fe0eb2f9ae.html
│ ├── dir_5d1450713377add98c1180fe0eb2f9ae.js
│ ├── dir_5eb17383be0272b71916d4988c97ae3c.html
│ ├── dir_5eb17383be0272b71916d4988c97ae3c.js
│ ├── dir_64302e4ed8e680c5e7832e1b7ea09baa.html
│ ├── dir_64302e4ed8e680c5e7832e1b7ea09baa.js
│ ├── dir_68267d1309a1af8e8297ef4c3efbcdba.html
│ ├── dir_6c5dd7babc86647cb00b5f49e0afc051.html
│ ├── dir_6c5dd7babc86647cb00b5f49e0afc051.js
│ ├── dir_717cf8a47ded45e56c3041f98a9ca441.html
│ ├── dir_75202c243db9baf385df0aac94b0acc0.html
│ ├── dir_75202c243db9baf385df0aac94b0acc0.js
│ ├── dir_79e598b17822ac3218a31651fbd84230.html
│ ├── dir_7a595d23279f99f2e5346245557e8271.html
│ ├── dir_7a595d23279f99f2e5346245557e8271.js
│ ├── dir_7b1b4a986f21cd07a017e6cd0f74eec4.html
│ ├── dir_81ad01bee8ed91a16e2e56d92ae48530.html
│ ├── dir_82823cd98c87c4bb1483bb7f879dfe68.html
│ ├── dir_87bdc2ec3fb2fe36f0442c7b9fa8c83c.html
│ ├── dir_87bdc2ec3fb2fe36f0442c7b9fa8c83c.js
│ ├── dir_93c065d202f1b2ae4be97868117427d8.html
│ ├── dir_93c065d202f1b2ae4be97868117427d8.js
│ ├── dir_94394ac86fa77e96e8d4c3af72ed61db.html
│ ├── dir_9ded64b83b3f5b23c7937ebd8f5ce2f1.html
│ ├── dir_a159881d357f96df4223872fd74cca14.html
│ ├── dir_aa00dbe797bd24fe05814e1a03a446ba.html
│ ├── dir_b668d86527323370c4668cb8bf07410d.html
│ ├── dir_ba769f4416b2c074a28c6130af43e345.html
│ ├── dir_ba769f4416b2c074a28c6130af43e345.js
│ ├── dir_c0ea682cca75c87761dacf1668992820.html
│ ├── dir_c0ea682cca75c87761dacf1668992820.js
│ ├── dir_c7fa37d54586c2d4e1bdb0bf9742bd86.html
│ ├── dir_c7fa37d54586c2d4e1bdb0bf9742bd86.js
│ ├── dir_ca7d207afbe6ec834644d82c9da0e27f.html
│ ├── dir_ca7d207afbe6ec834644d82c9da0e27f.js
│ ├── dir_cbab373848d17bb13c8f8154bda6a142.html
│ ├── dir_cde5b50139b2efdd71913c8f6e2f5b92.html
│ ├── dir_d0af3520e52159625e5c54b0a0666246.html
│ ├── dir_d0af3520e52159625e5c54b0a0666246.js
│ ├── dir_d28a4824dc47e487b107a5db32ef43c4.html
│ ├── dir_dbdb02b1c6a463d71690e5d1f101f3be.html
│ ├── dir_dbdb02b1c6a463d71690e5d1f101f3be.js
│ ├── dir_e0a5a45ea46034a62177509fd4cc477b.html
│ ├── dir_e55adf3e55c0cf2ab15afcf2abaa2799.html
│ ├── dir_e8b3846043ed55e70c4740c96c71631d.html
│ ├── dir_ec82c3f1a2edb4d01443ada27de98406.html
│ ├── dir_ec82c3f1a2edb4d01443ada27de98406.js
│ ├── dir_f5a6105ca7ea82175c57b6cc08e28f9f.html
│ ├── dir_f82b846bb6a413b95a3fa0edffb6464f.html
│ ├── doxygen.css
│ ├── doxygen_crawl.html
│ ├── dynsections.js
│ ├── files.html
│ ├── files_dup.js
│ ├── functions.html
│ ├── functions_b.html
│ ├── functions_c.html
│ ├── functions_d.html
│ ├── functions_dup.js
│ ├── functions_e.html
│ ├── functions_evnt.html
│ ├── functions_f.html
│ ├── functions_func.html
│ ├── functions_func.js
│ ├── functions_func_b.html
│ ├── functions_func_c.html
│ ├── functions_func_d.html
│ ├── functions_func_e.html
│ ├── functions_func_f.html
│ ├── functions_func_g.html
│ ├── functions_func_h.html
│ ├── functions_func_i.html
│ ├── functions_func_j.html
│ ├── functions_func_k.html
│ ├── functions_func_l.html
│ ├── functions_func_o.html
│ ├── functions_func_p.html
│ ├── functions_func_r.html
│ ├── functions_func_s.html
│ ├── functions_func_t.html
│ ├── functions_func_u.html
│ ├── functions_func_v.html
│ ├── functions_func_w.html
│ ├── functions_g.html
│ ├── functions_h.html
│ ├── functions_i.html
│ ├── functions_j.html
│ ├── functions_k.html
│ ├── functions_l.html
│ ├── functions_m.html
│ ├── functions_n.html
│ ├── functions_o.html
│ ├── functions_p.html
│ ├── functions_prop.html
│ ├── functions_prop.js
│ ├── functions_prop_b.html
│ ├── functions_prop_c.html
│ ├── functions_prop_d.html
│ ├── functions_prop_e.html
│ ├── functions_prop_f.html
│ ├── functions_prop_g.html
│ ├── functions_prop_h.html
│ ├── functions_prop_i.html
│ ├── functions_prop_j.html
│ ├── functions_prop_k.html
│ ├── functions_prop_l.html
│ ├── functions_prop_m.html
│ ├── functions_prop_n.html
│ ├── functions_prop_o.html
│ ├── functions_prop_p.html
│ ├── functions_prop_r.html
│ ├── functions_prop_s.html
│ ├── functions_prop_t.html
│ ├── functions_prop_u.html
│ ├── functions_prop_v.html
│ ├── functions_prop_w.html
│ ├── functions_r.html
│ ├── functions_s.html
│ ├── functions_t.html
│ ├── functions_u.html
│ ├── functions_v.html
│ ├── functions_vars.html
│ ├── functions_w.html
│ ├── hierarchy.html
│ ├── hierarchy.js
│ ├── index.html
│ ├── interface_nakama_1_1_console_1_1_i_api_account_device-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_account_device.html
│ ├── interface_nakama_1_1_console_1_1_i_api_account_device.js
│ ├── interface_nakama_1_1_console_1_1_i_api_channel_message-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_channel_message.html
│ ├── interface_nakama_1_1_console_1_1_i_api_channel_message.js
│ ├── interface_nakama_1_1_console_1_1_i_api_friend-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_friend.html
│ ├── interface_nakama_1_1_console_1_1_i_api_friend.js
│ ├── interface_nakama_1_1_console_1_1_i_api_friend_list-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_friend_list.html
│ ├── interface_nakama_1_1_console_1_1_i_api_friend_list.js
│ ├── interface_nakama_1_1_console_1_1_i_api_group-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_group.html
│ ├── interface_nakama_1_1_console_1_1_i_api_group.js
│ ├── interface_nakama_1_1_console_1_1_i_api_leaderboard_record-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_leaderboard_record.html
│ ├── interface_nakama_1_1_console_1_1_i_api_leaderboard_record.js
│ ├── interface_nakama_1_1_console_1_1_i_api_notification-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_notification.html
│ ├── interface_nakama_1_1_console_1_1_i_api_notification.js
│ ├── interface_nakama_1_1_console_1_1_i_api_storage_object-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_storage_object.html
│ ├── interface_nakama_1_1_console_1_1_i_api_storage_object.js
│ ├── interface_nakama_1_1_console_1_1_i_api_storage_object_ack-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_storage_object_ack.html
│ ├── interface_nakama_1_1_console_1_1_i_api_storage_object_ack.js
│ ├── interface_nakama_1_1_console_1_1_i_api_user-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_user.html
│ ├── interface_nakama_1_1_console_1_1_i_api_user.js
│ ├── interface_nakama_1_1_console_1_1_i_api_user_group_list-members.html
│ ├── interface_nakama_1_1_console_1_1_i_api_user_group_list.html
│ ├── interface_nakama_1_1_console_1_1_i_api_user_group_list.js
│ ├── interface_nakama_1_1_console_1_1_i_config_warning-members.html
│ ├── interface_nakama_1_1_console_1_1_i_config_warning.html
│ ├── interface_nakama_1_1_console_1_1_i_config_warning.js
│ ├── interface_nakama_1_1_console_1_1_i_console_account_export-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_account_export.html
│ ├── interface_nakama_1_1_console_1_1_i_console_account_export.js
│ ├── interface_nakama_1_1_console_1_1_i_console_authenticate_request-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_authenticate_request.html
│ ├── interface_nakama_1_1_console_1_1_i_console_authenticate_request.js
│ ├── interface_nakama_1_1_console_1_1_i_console_config-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_config.html
│ ├── interface_nakama_1_1_console_1_1_i_console_config.js
│ ├── interface_nakama_1_1_console_1_1_i_console_console_session-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_console_session.html
│ ├── interface_nakama_1_1_console_1_1_i_console_console_session.js
│ ├── interface_nakama_1_1_console_1_1_i_console_status_list-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_status_list.html
│ ├── interface_nakama_1_1_console_1_1_i_console_status_list.js
│ ├── interface_nakama_1_1_console_1_1_i_console_storage_list-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_storage_list.html
│ ├── interface_nakama_1_1_console_1_1_i_console_storage_list.js
│ ├── interface_nakama_1_1_console_1_1_i_console_unlink_device_request-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_unlink_device_request.html
│ ├── interface_nakama_1_1_console_1_1_i_console_unlink_device_request.js
│ ├── interface_nakama_1_1_console_1_1_i_console_user_list-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_user_list.html
│ ├── interface_nakama_1_1_console_1_1_i_console_user_list.js
│ ├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger.html
│ ├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger.js
│ ├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger_list-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger_list.html
│ ├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger_list.js
│ ├── interface_nakama_1_1_console_1_1_i_console_write_storage_object_request-members.html
│ ├── interface_nakama_1_1_console_1_1_i_console_write_storage_object_request.html
│ ├── interface_nakama_1_1_console_1_1_i_console_write_storage_object_request.js
│ ├── interface_nakama_1_1_console_1_1_i_nakamaapi_account-members.html
│ ├── interface_nakama_1_1_console_1_1_i_nakamaapi_account.html
│ ├── interface_nakama_1_1_console_1_1_i_nakamaapi_account.js
│ ├── interface_nakama_1_1_console_1_1_i_nakamaconsole_account-members.html
│ ├── interface_nakama_1_1_console_1_1_i_nakamaconsole_account.html
│ ├── interface_nakama_1_1_console_1_1_i_nakamaconsole_account.js
│ ├── interface_nakama_1_1_console_1_1_i_nakamaconsole_update_account_request-members.html
│ ├── interface_nakama_1_1_console_1_1_i_nakamaconsole_update_account_request.html
│ ├── interface_nakama_1_1_console_1_1_i_nakamaconsole_update_account_request.js
│ ├── interface_nakama_1_1_console_1_1_i_protobuf_any-members.html
│ ├── interface_nakama_1_1_console_1_1_i_protobuf_any.html
│ ├── interface_nakama_1_1_console_1_1_i_protobuf_any.js
│ ├── interface_nakama_1_1_console_1_1_i_runtime_error-members.html
│ ├── interface_nakama_1_1_console_1_1_i_runtime_error.html
│ ├── interface_nakama_1_1_console_1_1_i_runtime_error.js
│ ├── interface_nakama_1_1_console_1_1_i_status_list_status-members.html
│ ├── interface_nakama_1_1_console_1_1_i_status_list_status.html
│ ├── interface_nakama_1_1_console_1_1_i_status_list_status.js
│ ├── interface_nakama_1_1_console_1_1_i_user_group_list_user_group-members.html
│ ├── interface_nakama_1_1_console_1_1_i_user_group_list_user_group.html
│ ├── interface_nakama_1_1_console_1_1_i_user_group_list_user_group.js
│ ├── interface_nakama_1_1_i_api_account-members.html
│ ├── interface_nakama_1_1_i_api_account.html
│ ├── interface_nakama_1_1_i_api_account.js
│ ├── interface_nakama_1_1_i_api_account_apple-members.html
│ ├── interface_nakama_1_1_i_api_account_apple.html
│ ├── interface_nakama_1_1_i_api_account_apple.js
│ ├── interface_nakama_1_1_i_api_account_custom-members.html
│ ├── interface_nakama_1_1_i_api_account_custom.html
│ ├── interface_nakama_1_1_i_api_account_custom.js
│ ├── interface_nakama_1_1_i_api_account_device-members.html
│ ├── interface_nakama_1_1_i_api_account_device.html
│ ├── interface_nakama_1_1_i_api_account_device.js
│ ├── interface_nakama_1_1_i_api_account_email-members.html
│ ├── interface_nakama_1_1_i_api_account_email.html
│ ├── interface_nakama_1_1_i_api_account_email.js
│ ├── interface_nakama_1_1_i_api_account_facebook-members.html
│ ├── interface_nakama_1_1_i_api_account_facebook.html
│ ├── interface_nakama_1_1_i_api_account_facebook.js
│ ├── interface_nakama_1_1_i_api_account_facebook_instant_game-members.html
│ ├── interface_nakama_1_1_i_api_account_facebook_instant_game.html
│ ├── interface_nakama_1_1_i_api_account_facebook_instant_game.js
│ ├── interface_nakama_1_1_i_api_account_game_center-members.html
│ ├── interface_nakama_1_1_i_api_account_game_center.html
│ ├── interface_nakama_1_1_i_api_account_game_center.js
│ ├── interface_nakama_1_1_i_api_account_google-members.html
│ ├── interface_nakama_1_1_i_api_account_google.html
│ ├── interface_nakama_1_1_i_api_account_google.js
│ ├── interface_nakama_1_1_i_api_account_steam-members.html
│ ├── interface_nakama_1_1_i_api_account_steam.html
│ ├── interface_nakama_1_1_i_api_account_steam.js
│ ├── interface_nakama_1_1_i_api_channel_message-members.html
│ ├── interface_nakama_1_1_i_api_channel_message.html
│ ├── interface_nakama_1_1_i_api_channel_message.js
│ ├── interface_nakama_1_1_i_api_channel_message_list-members.html
│ ├── interface_nakama_1_1_i_api_channel_message_list.html
│ ├── interface_nakama_1_1_i_api_channel_message_list.js
│ ├── interface_nakama_1_1_i_api_create_group_request-members.html
│ ├── interface_nakama_1_1_i_api_create_group_request.html
│ ├── interface_nakama_1_1_i_api_create_group_request.js
│ ├── interface_nakama_1_1_i_api_delete_storage_object_id-members.html
│ ├── interface_nakama_1_1_i_api_delete_storage_object_id.html
│ ├── interface_nakama_1_1_i_api_delete_storage_object_id.js
│ ├── interface_nakama_1_1_i_api_delete_storage_objects_request-members.html
│ ├── interface_nakama_1_1_i_api_delete_storage_objects_request.html
│ ├── interface_nakama_1_1_i_api_delete_storage_objects_request.js
│ ├── interface_nakama_1_1_i_api_event-members.html
│ ├── interface_nakama_1_1_i_api_event.html
│ ├── interface_nakama_1_1_i_api_event.js
│ ├── interface_nakama_1_1_i_api_friend-members.html
│ ├── interface_nakama_1_1_i_api_friend.html
│ ├── interface_nakama_1_1_i_api_friend.js
│ ├── interface_nakama_1_1_i_api_friend_list-members.html
│ ├── interface_nakama_1_1_i_api_friend_list.html
│ ├── interface_nakama_1_1_i_api_friend_list.js
│ ├── interface_nakama_1_1_i_api_friends_of_friends_list-members.html
│ ├── interface_nakama_1_1_i_api_friends_of_friends_list.html
│ ├── interface_nakama_1_1_i_api_friends_of_friends_list.js
│ ├── interface_nakama_1_1_i_api_group-members.html
│ ├── interface_nakama_1_1_i_api_group.html
│ ├── interface_nakama_1_1_i_api_group.js
│ ├── interface_nakama_1_1_i_api_group_list-members.html
│ ├── interface_nakama_1_1_i_api_group_list.html
│ ├── interface_nakama_1_1_i_api_group_list.js
│ ├── interface_nakama_1_1_i_api_group_user_list-members.html
│ ├── interface_nakama_1_1_i_api_group_user_list.html
│ ├── interface_nakama_1_1_i_api_group_user_list.js
│ ├── interface_nakama_1_1_i_api_leaderboard_record-members.html
│ ├── interface_nakama_1_1_i_api_leaderboard_record.html
│ ├── interface_nakama_1_1_i_api_leaderboard_record.js
│ ├── interface_nakama_1_1_i_api_leaderboard_record_list-members.html
│ ├── interface_nakama_1_1_i_api_leaderboard_record_list.html
│ ├── interface_nakama_1_1_i_api_leaderboard_record_list.js
│ ├── interface_nakama_1_1_i_api_link_steam_request-members.html
│ ├── interface_nakama_1_1_i_api_link_steam_request.html
│ ├── interface_nakama_1_1_i_api_link_steam_request.js
│ ├── interface_nakama_1_1_i_api_list_subscriptions_request-members.html
│ ├── interface_nakama_1_1_i_api_list_subscriptions_request.html
│ ├── interface_nakama_1_1_i_api_list_subscriptions_request.js
│ ├── interface_nakama_1_1_i_api_match-members.html
│ ├── interface_nakama_1_1_i_api_match.html
│ ├── interface_nakama_1_1_i_api_match.js
│ ├── interface_nakama_1_1_i_api_match_list-members.html
│ ├── interface_nakama_1_1_i_api_match_list.html
│ ├── interface_nakama_1_1_i_api_match_list.js
│ ├── interface_nakama_1_1_i_api_matchmaker_completion_stats-members.html
│ ├── interface_nakama_1_1_i_api_matchmaker_completion_stats.html
│ ├── interface_nakama_1_1_i_api_matchmaker_completion_stats.js
│ ├── interface_nakama_1_1_i_api_matchmaker_stats-members.html
│ ├── interface_nakama_1_1_i_api_matchmaker_stats.html
│ ├── interface_nakama_1_1_i_api_matchmaker_stats.js
│ ├── interface_nakama_1_1_i_api_notification-members.html
│ ├── interface_nakama_1_1_i_api_notification.html
│ ├── interface_nakama_1_1_i_api_notification.js
│ ├── interface_nakama_1_1_i_api_notification_list-members.html
│ ├── interface_nakama_1_1_i_api_notification_list.html
│ ├── interface_nakama_1_1_i_api_notification_list.js
│ ├── interface_nakama_1_1_i_api_party-members.html
│ ├── interface_nakama_1_1_i_api_party.html
│ ├── interface_nakama_1_1_i_api_party.js
│ ├── interface_nakama_1_1_i_api_party_list-members.html
│ ├── interface_nakama_1_1_i_api_party_list.html
│ ├── interface_nakama_1_1_i_api_party_list.js
│ ├── interface_nakama_1_1_i_api_read_storage_object_id-members.html
│ ├── interface_nakama_1_1_i_api_read_storage_object_id.html
│ ├── interface_nakama_1_1_i_api_read_storage_object_id.js
│ ├── interface_nakama_1_1_i_api_read_storage_objects_request-members.html
│ ├── interface_nakama_1_1_i_api_read_storage_objects_request.html
│ ├── interface_nakama_1_1_i_api_read_storage_objects_request.js
│ ├── interface_nakama_1_1_i_api_rpc-members.html
│ ├── interface_nakama_1_1_i_api_rpc.html
│ ├── interface_nakama_1_1_i_api_rpc.js
│ ├── interface_nakama_1_1_i_api_session-members.html
│ ├── interface_nakama_1_1_i_api_session.html
│ ├── interface_nakama_1_1_i_api_session.js
│ ├── interface_nakama_1_1_i_api_session_logout_request-members.html
│ ├── interface_nakama_1_1_i_api_session_logout_request.html
│ ├── interface_nakama_1_1_i_api_session_logout_request.js
│ ├── interface_nakama_1_1_i_api_session_refresh_request-members.html
│ ├── interface_nakama_1_1_i_api_session_refresh_request.html
│ ├── interface_nakama_1_1_i_api_session_refresh_request.js
│ ├── interface_nakama_1_1_i_api_storage_object-members.html
│ ├── interface_nakama_1_1_i_api_storage_object.html
│ ├── interface_nakama_1_1_i_api_storage_object.js
│ ├── interface_nakama_1_1_i_api_storage_object_ack-members.html
│ ├── interface_nakama_1_1_i_api_storage_object_ack.html
│ ├── interface_nakama_1_1_i_api_storage_object_ack.js
│ ├── interface_nakama_1_1_i_api_storage_object_acks-members.html
│ ├── interface_nakama_1_1_i_api_storage_object_acks.html
│ ├── interface_nakama_1_1_i_api_storage_object_acks.js
│ ├── interface_nakama_1_1_i_api_storage_object_list-members.html
│ ├── interface_nakama_1_1_i_api_storage_object_list.html
│ ├── interface_nakama_1_1_i_api_storage_object_list.js
│ ├── interface_nakama_1_1_i_api_storage_objects-members.html
│ ├── interface_nakama_1_1_i_api_storage_objects.html
│ ├── interface_nakama_1_1_i_api_storage_objects.js
│ ├── interface_nakama_1_1_i_api_subscription_list-members.html
│ ├── interface_nakama_1_1_i_api_subscription_list.html
│ ├── interface_nakama_1_1_i_api_subscription_list.js
│ ├── interface_nakama_1_1_i_api_tournament-members.html
│ ├── interface_nakama_1_1_i_api_tournament.html
│ ├── interface_nakama_1_1_i_api_tournament.js
│ ├── interface_nakama_1_1_i_api_tournament_list-members.html
│ ├── interface_nakama_1_1_i_api_tournament_list.html
│ ├── interface_nakama_1_1_i_api_tournament_list.js
│ ├── interface_nakama_1_1_i_api_tournament_record_list-members.html
│ ├── interface_nakama_1_1_i_api_tournament_record_list.html
│ ├── interface_nakama_1_1_i_api_tournament_record_list.js
│ ├── interface_nakama_1_1_i_api_update_account_request-members.html
│ ├── interface_nakama_1_1_i_api_update_account_request.html
│ ├── interface_nakama_1_1_i_api_update_account_request.js
│ ├── interface_nakama_1_1_i_api_update_group_request-members.html
│ ├── interface_nakama_1_1_i_api_update_group_request.html
│ ├── interface_nakama_1_1_i_api_update_group_request.js
│ ├── interface_nakama_1_1_i_api_user-members.html
│ ├── interface_nakama_1_1_i_api_user.html
│ ├── interface_nakama_1_1_i_api_user.js
│ ├── interface_nakama_1_1_i_api_user_group_list-members.html
│ ├── interface_nakama_1_1_i_api_user_group_list.html
│ ├── interface_nakama_1_1_i_api_user_group_list.js
│ ├── interface_nakama_1_1_i_api_users-members.html
│ ├── interface_nakama_1_1_i_api_users.html
│ ├── interface_nakama_1_1_i_api_users.js
│ ├── interface_nakama_1_1_i_api_validate_purchase_apple_request-members.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_apple_request.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_apple_request.js
│ ├── interface_nakama_1_1_i_api_validate_purchase_facebook_instant_request-members.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_facebook_instant_request.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_facebook_instant_request.js
│ ├── interface_nakama_1_1_i_api_validate_purchase_google_request-members.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_google_request.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_google_request.js
│ ├── interface_nakama_1_1_i_api_validate_purchase_huawei_request-members.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_huawei_request.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_huawei_request.js
│ ├── interface_nakama_1_1_i_api_validate_purchase_response-members.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_response.html
│ ├── interface_nakama_1_1_i_api_validate_purchase_response.js
│ ├── interface_nakama_1_1_i_api_validate_subscription_apple_request-members.html
│ ├── interface_nakama_1_1_i_api_validate_subscription_apple_request.html
│ ├── interface_nakama_1_1_i_api_validate_subscription_apple_request.js
│ ├── interface_nakama_1_1_i_api_validate_subscription_google_request-members.html
│ ├── interface_nakama_1_1_i_api_validate_subscription_google_request.html
│ ├── interface_nakama_1_1_i_api_validate_subscription_google_request.js
│ ├── interface_nakama_1_1_i_api_validate_subscription_response-members.html
│ ├── interface_nakama_1_1_i_api_validate_subscription_response.html
│ ├── interface_nakama_1_1_i_api_validate_subscription_response.js
│ ├── interface_nakama_1_1_i_api_validated_purchase-members.html
│ ├── interface_nakama_1_1_i_api_validated_purchase.html
│ ├── interface_nakama_1_1_i_api_validated_purchase.js
│ ├── interface_nakama_1_1_i_api_validated_subscription-members.html
│ ├── interface_nakama_1_1_i_api_validated_subscription.html
│ ├── interface_nakama_1_1_i_api_validated_subscription.js
│ ├── interface_nakama_1_1_i_api_write_storage_object-members.html
│ ├── interface_nakama_1_1_i_api_write_storage_object.html
│ ├── interface_nakama_1_1_i_api_write_storage_object.js
│ ├── interface_nakama_1_1_i_api_write_storage_objects_request-members.html
│ ├── interface_nakama_1_1_i_api_write_storage_objects_request.html
│ ├── interface_nakama_1_1_i_api_write_storage_objects_request.js
│ ├── interface_nakama_1_1_i_channel-members.html
│ ├── interface_nakama_1_1_i_channel.html
│ ├── interface_nakama_1_1_i_channel.js
│ ├── interface_nakama_1_1_i_channel_message_ack-members.html
│ ├── interface_nakama_1_1_i_channel_message_ack.html
│ ├── interface_nakama_1_1_i_channel_message_ack.js
│ ├── interface_nakama_1_1_i_channel_presence_event-members.html
│ ├── interface_nakama_1_1_i_channel_presence_event.html
│ ├── interface_nakama_1_1_i_channel_presence_event.js
│ ├── interface_nakama_1_1_i_client-members.html
│ ├── interface_nakama_1_1_i_client.html
│ ├── interface_nakama_1_1_i_client.js
│ ├── interface_nakama_1_1_i_friends_of_friends_list_friend_of_friend-members.html
│ ├── interface_nakama_1_1_i_friends_of_friends_list_friend_of_friend.html
│ ├── interface_nakama_1_1_i_friends_of_friends_list_friend_of_friend.js
│ ├── interface_nakama_1_1_i_group_user_list_group_user-members.html
│ ├── interface_nakama_1_1_i_group_user_list_group_user.html
│ ├── interface_nakama_1_1_i_group_user_list_group_user.js
│ ├── interface_nakama_1_1_i_http_adapter-members.html
│ ├── interface_nakama_1_1_i_http_adapter.html
│ ├── interface_nakama_1_1_i_http_adapter.js
│ ├── interface_nakama_1_1_i_logger-members.html
│ ├── interface_nakama_1_1_i_logger.html
│ ├── interface_nakama_1_1_i_logger.js
│ ├── interface_nakama_1_1_i_match-members.html
│ ├── interface_nakama_1_1_i_match.html
│ ├── interface_nakama_1_1_i_match.js
│ ├── interface_nakama_1_1_i_match_presence_event-members.html
│ ├── interface_nakama_1_1_i_match_presence_event.html
│ ├── interface_nakama_1_1_i_match_presence_event.js
│ ├── interface_nakama_1_1_i_match_state-members.html
│ ├── interface_nakama_1_1_i_match_state.html
│ ├── interface_nakama_1_1_i_match_state.js
│ ├── interface_nakama_1_1_i_matchmaker_matched-members.html
│ ├── interface_nakama_1_1_i_matchmaker_matched.html
│ ├── interface_nakama_1_1_i_matchmaker_matched.js
│ ├── interface_nakama_1_1_i_matchmaker_ticket-members.html
│ ├── interface_nakama_1_1_i_matchmaker_ticket.html
│ ├── interface_nakama_1_1_i_matchmaker_ticket.js
│ ├── interface_nakama_1_1_i_matchmaker_user-members.html
│ ├── interface_nakama_1_1_i_matchmaker_user.html
│ ├── interface_nakama_1_1_i_matchmaker_user.js
│ ├── interface_nakama_1_1_i_party-members.html
│ ├── interface_nakama_1_1_i_party.html
│ ├── interface_nakama_1_1_i_party.js
│ ├── interface_nakama_1_1_i_party_close-members.html
│ ├── interface_nakama_1_1_i_party_close.html
│ ├── interface_nakama_1_1_i_party_close.js
│ ├── interface_nakama_1_1_i_party_data-members.html
│ ├── interface_nakama_1_1_i_party_data.html
│ ├── interface_nakama_1_1_i_party_data.js
│ ├── interface_nakama_1_1_i_party_join_request-members.html
│ ├── interface_nakama_1_1_i_party_join_request.html
│ ├── interface_nakama_1_1_i_party_join_request.js
│ ├── interface_nakama_1_1_i_party_leader-members.html
│ ├── interface_nakama_1_1_i_party_leader.html
│ ├── interface_nakama_1_1_i_party_leader.js
│ ├── interface_nakama_1_1_i_party_matchmaker_ticket-members.html
│ ├── interface_nakama_1_1_i_party_matchmaker_ticket.html
│ ├── interface_nakama_1_1_i_party_matchmaker_ticket.js
│ ├── interface_nakama_1_1_i_party_presence_event-members.html
│ ├── interface_nakama_1_1_i_party_presence_event.html
│ ├── interface_nakama_1_1_i_party_presence_event.js
│ ├── interface_nakama_1_1_i_party_update-members.html
│ ├── interface_nakama_1_1_i_party_update.html
│ ├── interface_nakama_1_1_i_party_update.js
│ ├── interface_nakama_1_1_i_protobuf_any-members.html
│ ├── interface_nakama_1_1_i_protobuf_any.html
│ ├── interface_nakama_1_1_i_protobuf_any.js
│ ├── interface_nakama_1_1_i_rpc_status-members.html
│ ├── interface_nakama_1_1_i_rpc_status.html
│ ├── interface_nakama_1_1_i_rpc_status.js
│ ├── interface_nakama_1_1_i_session-members.html
│ ├── interface_nakama_1_1_i_session.html
│ ├── interface_nakama_1_1_i_session.js
│ ├── interface_nakama_1_1_i_socket-members.html
│ ├── interface_nakama_1_1_i_socket.html
│ ├── interface_nakama_1_1_i_socket.js
│ ├── interface_nakama_1_1_i_socket_adapter-members.html
│ ├── interface_nakama_1_1_i_socket_adapter.html
│ ├── interface_nakama_1_1_i_socket_adapter.js
│ ├── interface_nakama_1_1_i_status-members.html
│ ├── interface_nakama_1_1_i_status.html
│ ├── interface_nakama_1_1_i_status.js
│ ├── interface_nakama_1_1_i_status_presence_event-members.html
│ ├── interface_nakama_1_1_i_status_presence_event.html
│ ├── interface_nakama_1_1_i_status_presence_event.js
│ ├── interface_nakama_1_1_i_stream-members.html
│ ├── interface_nakama_1_1_i_stream.html
│ ├── interface_nakama_1_1_i_stream.js
│ ├── interface_nakama_1_1_i_stream_presence_event-members.html
│ ├── interface_nakama_1_1_i_stream_presence_event.html
│ ├── interface_nakama_1_1_i_stream_presence_event.js
│ ├── interface_nakama_1_1_i_stream_state-members.html
│ ├── interface_nakama_1_1_i_stream_state.html
│ ├── interface_nakama_1_1_i_stream_state.js
│ ├── interface_nakama_1_1_i_user_group_list_user_group-members.html
│ ├── interface_nakama_1_1_i_user_group_list_user_group.html
│ ├── interface_nakama_1_1_i_user_group_list_user_group.js
│ ├── interface_nakama_1_1_i_user_presence-members.html
│ ├── interface_nakama_1_1_i_user_presence.html
│ ├── interface_nakama_1_1_i_user_presence.js
│ ├── interface_nakama_1_1_i_write_leaderboard_record_request_leaderboard_record_write-members.html
│ ├── interface_nakama_1_1_i_write_leaderboard_record_request_leaderboard_record_write.html
│ ├── interface_nakama_1_1_i_write_leaderboard_record_request_leaderboard_record_write.js
│ ├── interface_nakama_1_1_i_write_tournament_record_request_tournament_record_write-members.html
│ ├── interface_nakama_1_1_i_write_tournament_record_request_tournament_record_write.html
│ ├── interface_nakama_1_1_i_write_tournament_record_request_tournament_record_write.js
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_buffer_pool-members.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_buffer_pool.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_buffer_pool.js
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_ping_pong_manager-members.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_ping_pong_manager.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_ping_pong_manager.js
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_client_factory-members.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_client_factory.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_client_factory.js
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_server_factory-members.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_server_factory.html
│ ├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_server_factory.js
│ ├── interface_nakama_1_1_tests_1_1_i_nested_test_object-members.html
│ ├── interface_nakama_1_1_tests_1_1_i_nested_test_object.html
│ ├── interface_nakama_1_1_tests_1_1_i_test_object-members.html
│ ├── interface_nakama_1_1_tests_1_1_i_test_object.html
│ ├── interface_satori_1_1_i_api_authenticate_logout_request-members.html
│ ├── interface_satori_1_1_i_api_authenticate_logout_request.html
│ ├── interface_satori_1_1_i_api_authenticate_logout_request.js
│ ├── interface_satori_1_1_i_api_authenticate_refresh_request-members.html
│ ├── interface_satori_1_1_i_api_authenticate_refresh_request.html
│ ├── interface_satori_1_1_i_api_authenticate_refresh_request.js
│ ├── interface_satori_1_1_i_api_authenticate_request-members.html
│ ├── interface_satori_1_1_i_api_authenticate_request.html
│ ├── interface_satori_1_1_i_api_authenticate_request.js
│ ├── interface_satori_1_1_i_api_event-members.html
│ ├── interface_satori_1_1_i_api_event.html
│ ├── interface_satori_1_1_i_api_event.js
│ ├── interface_satori_1_1_i_api_event_request-members.html
│ ├── interface_satori_1_1_i_api_event_request.html
│ ├── interface_satori_1_1_i_api_event_request.js
│ ├── interface_satori_1_1_i_api_experiment-members.html
│ ├── interface_satori_1_1_i_api_experiment.html
│ ├── interface_satori_1_1_i_api_experiment.js
│ ├── interface_satori_1_1_i_api_experiment_list-members.html
│ ├── interface_satori_1_1_i_api_experiment_list.html
│ ├── interface_satori_1_1_i_api_experiment_list.js
│ ├── interface_satori_1_1_i_api_flag-members.html
│ ├── interface_satori_1_1_i_api_flag.html
│ ├── interface_satori_1_1_i_api_flag.js
│ ├── interface_satori_1_1_i_api_flag_list-members.html
│ ├── interface_satori_1_1_i_api_flag_list.html
│ ├── interface_satori_1_1_i_api_flag_list.js
│ ├── interface_satori_1_1_i_api_flag_override-members.html
│ ├── interface_satori_1_1_i_api_flag_override.html
│ ├── interface_satori_1_1_i_api_flag_override.js
│ ├── interface_satori_1_1_i_api_flag_override_list-members.html
│ ├── interface_satori_1_1_i_api_flag_override_list.html
│ ├── interface_satori_1_1_i_api_flag_override_list.js
│ ├── interface_satori_1_1_i_api_flag_override_value-members.html
│ ├── interface_satori_1_1_i_api_flag_override_value.html
│ ├── interface_satori_1_1_i_api_flag_override_value.js
│ ├── interface_satori_1_1_i_api_get_message_list_response-members.html
│ ├── interface_satori_1_1_i_api_get_message_list_response.html
│ ├── interface_satori_1_1_i_api_get_message_list_response.js
│ ├── interface_satori_1_1_i_api_identify_request-members.html
│ ├── interface_satori_1_1_i_api_identify_request.html
│ ├── interface_satori_1_1_i_api_identify_request.js
│ ├── interface_satori_1_1_i_api_live_event-members.html
│ ├── interface_satori_1_1_i_api_live_event.html
│ ├── interface_satori_1_1_i_api_live_event.js
│ ├── interface_satori_1_1_i_api_live_event_list-members.html
│ ├── interface_satori_1_1_i_api_live_event_list.html
│ ├── interface_satori_1_1_i_api_live_event_list.js
│ ├── interface_satori_1_1_i_api_message-members.html
│ ├── interface_satori_1_1_i_api_message.html
│ ├── interface_satori_1_1_i_api_message.js
│ ├── interface_satori_1_1_i_api_properties-members.html
│ ├── interface_satori_1_1_i_api_properties.html
│ ├── interface_satori_1_1_i_api_properties.js
│ ├── interface_satori_1_1_i_api_session-members.html
│ ├── interface_satori_1_1_i_api_session.html
│ ├── interface_satori_1_1_i_api_session.js
│ ├── interface_satori_1_1_i_api_update_message_request-members.html
│ ├── interface_satori_1_1_i_api_update_message_request.html
│ ├── interface_satori_1_1_i_api_update_message_request.js
│ ├── interface_satori_1_1_i_api_update_properties_request-members.html
│ ├── interface_satori_1_1_i_api_update_properties_request.html
│ ├── interface_satori_1_1_i_api_update_properties_request.js
│ ├── interface_satori_1_1_i_client-members.html
│ ├── interface_satori_1_1_i_client.html
│ ├── interface_satori_1_1_i_client.js
│ ├── interface_satori_1_1_i_flag_value_change_reason-members.html
│ ├── interface_satori_1_1_i_flag_value_change_reason.html
│ ├── interface_satori_1_1_i_flag_value_change_reason.js
│ ├── interface_satori_1_1_i_http_adapter-members.html
│ ├── interface_satori_1_1_i_http_adapter.html
│ ├── interface_satori_1_1_i_http_adapter.js
│ ├── interface_satori_1_1_i_logger-members.html
│ ├── interface_satori_1_1_i_logger.html
│ ├── interface_satori_1_1_i_logger.js
│ ├── interface_satori_1_1_i_protobuf_any-members.html
│ ├── interface_satori_1_1_i_protobuf_any.html
│ ├── interface_satori_1_1_i_protobuf_any.js
│ ├── interface_satori_1_1_i_rpc_status-members.html
│ ├── interface_satori_1_1_i_rpc_status.html
│ ├── interface_satori_1_1_i_rpc_status.js
│ ├── interface_satori_1_1_i_session-members.html
│ ├── interface_satori_1_1_i_session.html
│ ├── interface_satori_1_1_i_session.js
│ ├── jquery.js
│ ├── md__2_users_2flavio_2_projects_2heroiclabs_2nakama-dotnet_2_c_h_a_n_g_e_l_o_g.html
│ ├── md__2_users_2gp_2_documents_2_git_hub_2nakama-dotnet_2_c_h_a_n_g_e_l_o_g.html
│ ├── md__2_users_2gp_2_git_hub_2nakama-dotnet_2_c_h_a_n_g_e_l_o_g.html
│ ├── md__2_users_2joao_2_projects_2heroic_2nakama-dotnet_2_c_h_a_n_g_e_l_o_g.html
│ ├── md__2_users_2novabyte_2_heroic-_labs_2_projects_2nakama-dotnet_2_c_h_a_n_g_e_l_o_g.html
│ ├── md___users_sean__documents__git_hub_nakama_dotnet__c_h_a_n_g_e_l_o_g.html
│ ├── md___users_tom_heroic_projects_nakama_dotnet__c_h_a_n_g_e_l_o_g.html
│ ├── md__c_h_a_n_g_e_l_o_g.html
│ ├── md__r_e_a_d_m_e.html
│ ├── md__r_e_l_e_a_s_e_i_n_s_t.html
│ ├── md__satori__tests__r_e_a_d_m_e.html
│ ├── md_codegen__r_e_a_d_m_e.html
│ ├── menu.js
│ ├── menudata.js
│ ├── namespace_nakama.html
│ ├── namespace_nakama.js
│ ├── namespace_nakama_1_1_console.html
│ ├── namespace_nakama_1_1_console.js
│ ├── namespace_nakama_1_1_ninja.html
│ ├── namespace_nakama_1_1_ninja.js
│ ├── namespace_nakama_1_1_ninja_1_1_web_sockets.html
│ ├── namespace_nakama_1_1_ninja_1_1_web_sockets.js
│ ├── namespace_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions.html
│ ├── namespace_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions.js
│ ├── namespace_nakama_1_1_ninja_1_1_web_sockets_1_1_internal.html
│ ├── namespace_nakama_1_1_tests.html
│ ├── namespace_nakama_1_1_tests.js
│ ├── namespace_nakama_1_1_tests_1_1_api.html
│ ├── namespace_nakama_1_1_tests_1_1_api.js
│ ├── namespace_nakama_1_1_tests_1_1_socket.html
│ ├── namespace_nakama_1_1_tests_1_1_socket.js
│ ├── namespace_nakama_1_1_tiny_json.html
│ ├── namespace_satori.html
│ ├── namespace_satori.js
│ ├── namespace_satori_1_1_tests.html
│ ├── namespace_satori_1_1_tests.js
│ ├── namespace_satori_1_1_tiny_json.html
│ ├── namespacemembers.html
│ ├── namespacemembers_enum.html
│ ├── namespacemembers_func.html
│ ├── namespaces.html
│ ├── namespaces_dup.js
│ ├── navtree.css
│ ├── navtree.js
│ ├── navtreedata.js
│ ├── navtreeindex0.js
│ ├── navtreeindex1.js
│ ├── navtreeindex10.js
│ ├── navtreeindex11.js
│ ├── navtreeindex12.js
│ ├── navtreeindex13.js
│ ├── navtreeindex2.js
│ ├── navtreeindex3.js
│ ├── navtreeindex4.js
│ ├── navtreeindex5.js
│ ├── navtreeindex6.js
│ ├── navtreeindex7.js
│ ├── navtreeindex8.js
│ ├── navtreeindex9.js
│ ├── net46_2_nakama_8_assembly_info_8cs.html
│ ├── net46_2_satori_8_assembly_info_8cs.html
│ ├── netstandard2_80_2_nakama_8_assembly_info_8cs.html
│ ├── netstandard2_80_2_satori_8_assembly_info_8cs.html
│ ├── pages.html
│ ├── resize.js
│ ├── search/
│ │ ├── all_0.html
│ │ ├── all_0.js
│ │ ├── all_1.html
│ │ ├── all_1.js
│ │ ├── all_10.html
│ │ ├── all_10.js
│ │ ├── all_11.html
│ │ ├── all_11.js
│ │ ├── all_12.html
│ │ ├── all_12.js
│ │ ├── all_13.html
│ │ ├── all_13.js
│ │ ├── all_14.html
│ │ ├── all_14.js
│ │ ├── all_15.html
│ │ ├── all_15.js
│ │ ├── all_2.html
│ │ ├── all_2.js
│ │ ├── all_3.html
│ │ ├── all_3.js
│ │ ├── all_4.html
│ │ ├── all_4.js
│ │ ├── all_5.html
│ │ ├── all_5.js
│ │ ├── all_6.html
│ │ ├── all_6.js
│ │ ├── all_7.html
│ │ ├── all_7.js
│ │ ├── all_8.html
│ │ ├── all_8.js
│ │ ├── all_9.html
│ │ ├── all_9.js
│ │ ├── all_a.html
│ │ ├── all_a.js
│ │ ├── all_b.html
│ │ ├── all_b.js
│ │ ├── all_c.html
│ │ ├── all_c.js
│ │ ├── all_d.html
│ │ ├── all_d.js
│ │ ├── all_e.html
│ │ ├── all_e.js
│ │ ├── all_f.html
│ │ ├── all_f.js
│ │ ├── classes_0.html
│ │ ├── classes_0.js
│ │ ├── classes_1.html
│ │ ├── classes_1.js
│ │ ├── classes_2.html
│ │ ├── classes_2.js
│ │ ├── classes_3.html
│ │ ├── classes_3.js
│ │ ├── classes_4.html
│ │ ├── classes_4.js
│ │ ├── classes_5.html
│ │ ├── classes_5.js
│ │ ├── classes_6.html
│ │ ├── classes_6.js
│ │ ├── classes_7.html
│ │ ├── classes_7.js
│ │ ├── classes_8.html
│ │ ├── classes_8.js
│ │ ├── classes_9.html
│ │ ├── classes_9.js
│ │ ├── classes_a.js
│ │ ├── classes_b.js
│ │ ├── classes_c.js
│ │ ├── enums_0.html
│ │ ├── enums_0.js
│ │ ├── enums_1.html
│ │ ├── enums_1.js
│ │ ├── enums_2.js
│ │ ├── enumvalues_0.html
│ │ ├── enumvalues_0.js
│ │ ├── enumvalues_1.html
│ │ ├── enumvalues_1.js
│ │ ├── enumvalues_2.html
│ │ ├── enumvalues_2.js
│ │ ├── enumvalues_3.html
│ │ ├── enumvalues_3.js
│ │ ├── enumvalues_4.html
│ │ ├── enumvalues_4.js
│ │ ├── enumvalues_5.html
│ │ ├── enumvalues_5.js
│ │ ├── enumvalues_6.html
│ │ ├── enumvalues_6.js
│ │ ├── enumvalues_7.html
│ │ ├── enumvalues_7.js
│ │ ├── enumvalues_8.js
│ │ ├── enumvalues_9.js
│ │ ├── enumvalues_a.js
│ │ ├── enumvalues_b.js
│ │ ├── enumvalues_c.js
│ │ ├── enumvalues_d.js
│ │ ├── events_0.html
│ │ ├── events_0.js
│ │ ├── events_1.html
│ │ ├── events_1.js
│ │ ├── events_2.html
│ │ ├── events_2.js
│ │ ├── files_0.html
│ │ ├── files_0.js
│ │ ├── files_1.html
│ │ ├── files_1.js
│ │ ├── files_2.html
│ │ ├── files_2.js
│ │ ├── files_3.html
│ │ ├── files_3.js
│ │ ├── files_4.html
│ │ ├── files_4.js
│ │ ├── files_5.html
│ │ ├── files_5.js
│ │ ├── files_6.html
│ │ ├── files_6.js
│ │ ├── files_7.html
│ │ ├── files_7.js
│ │ ├── files_8.html
│ │ ├── files_8.js
│ │ ├── files_9.html
│ │ ├── files_9.js
│ │ ├── files_a.html
│ │ ├── files_a.js
│ │ ├── files_b.html
│ │ ├── files_b.js
│ │ ├── files_c.html
│ │ ├── files_c.js
│ │ ├── files_d.html
│ │ ├── files_d.js
│ │ ├── files_e.js
│ │ ├── files_f.js
│ │ ├── functions_0.html
│ │ ├── functions_0.js
│ │ ├── functions_1.html
│ │ ├── functions_1.js
│ │ ├── functions_10.html
│ │ ├── functions_10.js
│ │ ├── functions_11.html
│ │ ├── functions_11.js
│ │ ├── functions_12.html
│ │ ├── functions_12.js
│ │ ├── functions_13.html
│ │ ├── functions_13.js
│ │ ├── functions_2.html
│ │ ├── functions_2.js
│ │ ├── functions_3.html
│ │ ├── functions_3.js
│ │ ├── functions_4.html
│ │ ├── functions_4.js
│ │ ├── functions_5.html
│ │ ├── functions_5.js
│ │ ├── functions_6.html
│ │ ├── functions_6.js
│ │ ├── functions_7.html
│ │ ├── functions_7.js
│ │ ├── functions_8.html
│ │ ├── functions_8.js
│ │ ├── functions_9.html
│ │ ├── functions_9.js
│ │ ├── functions_a.html
│ │ ├── functions_a.js
│ │ ├── functions_b.html
│ │ ├── functions_b.js
│ │ ├── functions_c.html
│ │ ├── functions_c.js
│ │ ├── functions_d.html
│ │ ├── functions_d.js
│ │ ├── functions_e.html
│ │ ├── functions_e.js
│ │ ├── functions_f.html
│ │ ├── functions_f.js
│ │ ├── namespaces_0.html
│ │ ├── namespaces_0.js
│ │ ├── namespaces_1.js
│ │ ├── nomatches.html
│ │ ├── pages_0.html
│ │ ├── pages_0.js
│ │ ├── pages_1.html
│ │ ├── pages_1.js
│ │ ├── pages_2.js
│ │ ├── properties_0.html
│ │ ├── properties_0.js
│ │ ├── properties_1.html
│ │ ├── properties_1.js
│ │ ├── properties_10.html
│ │ ├── properties_10.js
│ │ ├── properties_11.html
│ │ ├── properties_11.js
│ │ ├── properties_12.html
│ │ ├── properties_12.js
│ │ ├── properties_13.html
│ │ ├── properties_13.js
│ │ ├── properties_14.html
│ │ ├── properties_14.js
│ │ ├── properties_15.html
│ │ ├── properties_15.js
│ │ ├── properties_2.html
│ │ ├── properties_2.js
│ │ ├── properties_3.html
│ │ ├── properties_3.js
│ │ ├── properties_4.html
│ │ ├── properties_4.js
│ │ ├── properties_5.html
│ │ ├── properties_5.js
│ │ ├── properties_6.html
│ │ ├── properties_6.js
│ │ ├── properties_7.html
│ │ ├── properties_7.js
│ │ ├── properties_8.html
│ │ ├── properties_8.js
│ │ ├── properties_9.html
│ │ ├── properties_9.js
│ │ ├── properties_a.html
│ │ ├── properties_a.js
│ │ ├── properties_b.html
│ │ ├── properties_b.js
│ │ ├── properties_c.html
│ │ ├── properties_c.js
│ │ ├── properties_d.html
│ │ ├── properties_d.js
│ │ ├── properties_e.html
│ │ ├── properties_e.js
│ │ ├── properties_f.html
│ │ ├── properties_f.js
│ │ ├── search.css
│ │ ├── search.js
│ │ ├── searchdata.js
│ │ ├── variables_0.html
│ │ ├── variables_0.js
│ │ ├── variables_1.html
│ │ └── variables_1.js
│ └── tabs.css
├── index.html
└── latex/
├── Makefile
├── annotated.tex
├── class_nakama_1_1_api_response_exception.eps
├── class_nakama_1_1_api_response_exception.tex
├── class_nakama_1_1_client.eps
├── class_nakama_1_1_client.tex
├── class_nakama_1_1_console_1_1_api_response_exception.eps
├── class_nakama_1_1_console_1_1_api_response_exception.tex
├── class_nakama_1_1_http_request_adapter.eps
├── class_nakama_1_1_http_request_adapter.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool_1_1_public_buffer_memory_stream.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_buffer_pool_1_1_public_buffer_memory_stream.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_entity_too_large_exception.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_entity_too_large_exception.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_invalid_http_response_code_exception.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_invalid_http_response_code_exception.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_sec_web_socket_key_missing_exception.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_sec_web_socket_key_missing_exception.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_server_listener_socket_exception.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_server_listener_socket_exception.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_buffer_overflow_exception.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_buffer_overflow_exception.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_handshake_failed_exception.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_handshake_failed_exception.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_version_not_supported_exception.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions_1_1_web_socket_version_not_supported_exception.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_http_helper.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_ping_pong_manager.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_ping_pong_manager.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_pong_event_args.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_pong_event_args.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_factory.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_factory.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_client_options.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_http_context.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_factory.eps
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_factory.tex
├── class_nakama_1_1_ninja_1_1_web_sockets_1_1_web_socket_server_options.tex
├── class_nakama_1_1_retry.tex
├── class_nakama_1_1_retry_configuration.tex
├── class_nakama_1_1_session.eps
├── class_nakama_1_1_session.tex
├── class_nakama_1_1_socket.eps
├── class_nakama_1_1_socket.tex
├── class_nakama_1_1_storage_object_id.eps
├── class_nakama_1_1_storage_object_id.tex
├── class_nakama_1_1_tests_1_1_api_1_1_authenticate_test.tex
├── class_nakama_1_1_tests_1_1_api_1_1_group_test.tex
├── class_nakama_1_1_tests_1_1_api_1_1_http_error_test.tex
├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_around_owner_test.eps
├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_around_owner_test.tex
├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_test.eps
├── class_nakama_1_1_tests_1_1_api_1_1_leaderboard_test.tex
├── class_nakama_1_1_tests_1_1_api_1_1_link_unlink_test.tex
├── class_nakama_1_1_tests_1_1_api_1_1_rpc_test.tex
├── class_nakama_1_1_tests_1_1_awaited_socket_task_test.eps
├── class_nakama_1_1_tests_1_1_awaited_socket_task_test.tex
├── class_nakama_1_1_tests_1_1_cancel_test.tex
├── class_nakama_1_1_tests_1_1_retry_test.tex
├── class_nakama_1_1_tests_1_1_session_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_channel_test.eps
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_channel_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_match_test.eps
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_match_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_matchmaker_test.eps
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_matchmaker_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_notification_test.eps
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_notification_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_party_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_rpc_test.eps
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_rpc_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_test.tex
├── class_nakama_1_1_tests_1_1_socket_1_1_web_socket_user_status_test.tex
├── class_nakama_1_1_tests_1_1_stdout_logger.eps
├── class_nakama_1_1_tests_1_1_stdout_logger.tex
├── class_nakama_1_1_tests_1_1_tiny_json_parser_test.tex
├── class_nakama_1_1_tests_1_1_transient_exception_http_adapter.eps
├── class_nakama_1_1_tests_1_1_transient_exception_http_adapter.tex
├── class_nakama_1_1_web_socket_adapter.eps
├── class_nakama_1_1_web_socket_adapter.tex
├── class_nakama_1_1_web_socket_stdlib_adapter.eps
├── class_nakama_1_1_web_socket_stdlib_adapter.tex
├── class_nakama_1_1_write_storage_object.eps
├── class_nakama_1_1_write_storage_object.tex
├── class_satori_1_1_api_response_exception.eps
├── class_satori_1_1_api_response_exception.tex
├── class_satori_1_1_client.eps
├── class_satori_1_1_client.tex
├── class_satori_1_1_event.tex
├── class_satori_1_1_http_request_adapter.eps
├── class_satori_1_1_http_request_adapter.tex
├── class_satori_1_1_session.eps
├── class_satori_1_1_session.tex
├── class_satori_1_1_tests_1_1_client_test.tex
├── doxygen.sty
├── hierarchy.tex
├── index.tex
├── interface_nakama_1_1_console_1_1_i_api_account_device.tex
├── interface_nakama_1_1_console_1_1_i_api_channel_message.tex
├── interface_nakama_1_1_console_1_1_i_api_friend.tex
├── interface_nakama_1_1_console_1_1_i_api_friend_list.tex
├── interface_nakama_1_1_console_1_1_i_api_group.tex
├── interface_nakama_1_1_console_1_1_i_api_leaderboard_record.tex
├── interface_nakama_1_1_console_1_1_i_api_notification.tex
├── interface_nakama_1_1_console_1_1_i_api_storage_object.tex
├── interface_nakama_1_1_console_1_1_i_api_storage_object_ack.tex
├── interface_nakama_1_1_console_1_1_i_api_user.tex
├── interface_nakama_1_1_console_1_1_i_api_user_group_list.tex
├── interface_nakama_1_1_console_1_1_i_config_warning.tex
├── interface_nakama_1_1_console_1_1_i_console_account_export.tex
├── interface_nakama_1_1_console_1_1_i_console_authenticate_request.tex
├── interface_nakama_1_1_console_1_1_i_console_config.tex
├── interface_nakama_1_1_console_1_1_i_console_console_session.tex
├── interface_nakama_1_1_console_1_1_i_console_status_list.tex
├── interface_nakama_1_1_console_1_1_i_console_storage_list.tex
├── interface_nakama_1_1_console_1_1_i_console_unlink_device_request.tex
├── interface_nakama_1_1_console_1_1_i_console_user_list.tex
├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger.tex
├── interface_nakama_1_1_console_1_1_i_console_wallet_ledger_list.tex
├── interface_nakama_1_1_console_1_1_i_console_write_storage_object_request.tex
├── interface_nakama_1_1_console_1_1_i_nakamaapi_account.tex
├── interface_nakama_1_1_console_1_1_i_nakamaconsole_account.tex
├── interface_nakama_1_1_console_1_1_i_nakamaconsole_update_account_request.tex
├── interface_nakama_1_1_console_1_1_i_protobuf_any.tex
├── interface_nakama_1_1_console_1_1_i_runtime_error.tex
├── interface_nakama_1_1_console_1_1_i_status_list_status.tex
├── interface_nakama_1_1_console_1_1_i_user_group_list_user_group.tex
├── interface_nakama_1_1_i_api_account.tex
├── interface_nakama_1_1_i_api_account_apple.tex
├── interface_nakama_1_1_i_api_account_custom.tex
├── interface_nakama_1_1_i_api_account_device.tex
├── interface_nakama_1_1_i_api_account_email.tex
├── interface_nakama_1_1_i_api_account_facebook.tex
├── interface_nakama_1_1_i_api_account_facebook_instant_game.tex
├── interface_nakama_1_1_i_api_account_game_center.tex
├── interface_nakama_1_1_i_api_account_google.tex
├── interface_nakama_1_1_i_api_account_steam.tex
├── interface_nakama_1_1_i_api_channel_message.tex
├── interface_nakama_1_1_i_api_channel_message_list.tex
├── interface_nakama_1_1_i_api_create_group_request.tex
├── interface_nakama_1_1_i_api_delete_storage_object_id.eps
├── interface_nakama_1_1_i_api_delete_storage_object_id.tex
├── interface_nakama_1_1_i_api_delete_storage_objects_request.tex
├── interface_nakama_1_1_i_api_event.tex
├── interface_nakama_1_1_i_api_friend.tex
├── interface_nakama_1_1_i_api_friend_list.tex
├── interface_nakama_1_1_i_api_group.tex
├── interface_nakama_1_1_i_api_group_list.tex
├── interface_nakama_1_1_i_api_group_user_list.tex
├── interface_nakama_1_1_i_api_leaderboard_record.tex
├── interface_nakama_1_1_i_api_leaderboard_record_list.tex
├── interface_nakama_1_1_i_api_link_steam_request.tex
├── interface_nakama_1_1_i_api_list_subscriptions_request.tex
├── interface_nakama_1_1_i_api_match.tex
├── interface_nakama_1_1_i_api_match_list.tex
├── interface_nakama_1_1_i_api_notification.tex
├── interface_nakama_1_1_i_api_notification_list.tex
├── interface_nakama_1_1_i_api_read_storage_object_id.eps
├── interface_nakama_1_1_i_api_read_storage_object_id.tex
├── interface_nakama_1_1_i_api_read_storage_objects_request.tex
├── interface_nakama_1_1_i_api_rpc.tex
├── interface_nakama_1_1_i_api_session.tex
├── interface_nakama_1_1_i_api_session_logout_request.tex
├── interface_nakama_1_1_i_api_session_refresh_request.tex
├── interface_nakama_1_1_i_api_storage_object.tex
├── interface_nakama_1_1_i_api_storage_object_ack.tex
├── interface_nakama_1_1_i_api_storage_object_acks.tex
├── interface_nakama_1_1_i_api_storage_object_list.tex
├── interface_nakama_1_1_i_api_storage_objects.tex
├── interface_nakama_1_1_i_api_subscription_list.tex
├── interface_nakama_1_1_i_api_tournament.tex
├── interface_nakama_1_1_i_api_tournament_list.tex
├── interface_nakama_1_1_i_api_tournament_record_list.tex
├── interface_nakama_1_1_i_api_update_account_request.tex
├── interface_nakama_1_1_i_api_update_group_request.tex
├── interface_nakama_1_1_i_api_user.tex
├── interface_nakama_1_1_i_api_user_group_list.tex
├── interface_nakama_1_1_i_api_users.tex
├── interface_nakama_1_1_i_api_validate_purchase_apple_request.tex
├── interface_nakama_1_1_i_api_validate_purchase_google_request.tex
├── interface_nakama_1_1_i_api_validate_purchase_huawei_request.tex
├── interface_nakama_1_1_i_api_validate_purchase_response.tex
├── interface_nakama_1_1_i_api_validate_subscription_apple_request.tex
├── interface_nakama_1_1_i_api_validate_subscription_google_request.tex
├── interface_nakama_1_1_i_api_validate_subscription_response.tex
├── interface_nakama_1_1_i_api_validated_purchase.tex
├── interface_nakama_1_1_i_api_validated_subscription.tex
├── interface_nakama_1_1_i_api_write_storage_object.eps
├── interface_nakama_1_1_i_api_write_storage_object.tex
├── interface_nakama_1_1_i_api_write_storage_objects_request.tex
├── interface_nakama_1_1_i_channel.tex
├── interface_nakama_1_1_i_channel_message_ack.tex
├── interface_nakama_1_1_i_channel_presence_event.tex
├── interface_nakama_1_1_i_client.eps
├── interface_nakama_1_1_i_client.tex
├── interface_nakama_1_1_i_group_user_list_group_user.tex
├── interface_nakama_1_1_i_http_adapter.eps
├── interface_nakama_1_1_i_http_adapter.tex
├── interface_nakama_1_1_i_logger.eps
├── interface_nakama_1_1_i_logger.tex
├── interface_nakama_1_1_i_match.tex
├── interface_nakama_1_1_i_match_presence_event.tex
├── interface_nakama_1_1_i_match_state.tex
├── interface_nakama_1_1_i_matchmaker_matched.tex
├── interface_nakama_1_1_i_matchmaker_ticket.tex
├── interface_nakama_1_1_i_matchmaker_user.tex
├── interface_nakama_1_1_i_party.tex
├── interface_nakama_1_1_i_party_close.tex
├── interface_nakama_1_1_i_party_data.tex
├── interface_nakama_1_1_i_party_join_request.tex
├── interface_nakama_1_1_i_party_leader.tex
├── interface_nakama_1_1_i_party_matchmaker_ticket.tex
├── interface_nakama_1_1_i_party_presence_event.tex
├── interface_nakama_1_1_i_protobuf_any.tex
├── interface_nakama_1_1_i_rpc_status.tex
├── interface_nakama_1_1_i_session.eps
├── interface_nakama_1_1_i_session.tex
├── interface_nakama_1_1_i_socket.eps
├── interface_nakama_1_1_i_socket.tex
├── interface_nakama_1_1_i_socket_adapter.eps
├── interface_nakama_1_1_i_socket_adapter.tex
├── interface_nakama_1_1_i_status.tex
├── interface_nakama_1_1_i_status_presence_event.tex
├── interface_nakama_1_1_i_stream.tex
├── interface_nakama_1_1_i_stream_presence_event.tex
├── interface_nakama_1_1_i_stream_state.tex
├── interface_nakama_1_1_i_user_group_list_user_group.tex
├── interface_nakama_1_1_i_user_presence.tex
├── interface_nakama_1_1_i_write_leaderboard_record_request_leaderboard_record_write.tex
├── interface_nakama_1_1_i_write_tournament_record_request_tournament_record_write.tex
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_buffer_pool.eps
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_buffer_pool.tex
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_ping_pong_manager.eps
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_ping_pong_manager.tex
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_client_factory.eps
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_client_factory.tex
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_server_factory.eps
├── interface_nakama_1_1_ninja_1_1_web_sockets_1_1_i_web_socket_server_factory.tex
├── interface_nakama_1_1_tests_1_1_i_nested_test_object.tex
├── interface_nakama_1_1_tests_1_1_i_test_object.tex
├── interface_satori_1_1_i_api_authenticate_logout_request.tex
├── interface_satori_1_1_i_api_authenticate_refresh_request.tex
├── interface_satori_1_1_i_api_authenticate_request.tex
├── interface_satori_1_1_i_api_event.tex
├── interface_satori_1_1_i_api_event_request.tex
├── interface_satori_1_1_i_api_experiment.tex
├── interface_satori_1_1_i_api_experiment_list.tex
├── interface_satori_1_1_i_api_flag.tex
├── interface_satori_1_1_i_api_flag_list.tex
├── interface_satori_1_1_i_api_identify_request.tex
├── interface_satori_1_1_i_api_live_event.tex
├── interface_satori_1_1_i_api_live_event_list.tex
├── interface_satori_1_1_i_api_properties.tex
├── interface_satori_1_1_i_api_session.tex
├── interface_satori_1_1_i_api_update_properties_request.tex
├── interface_satori_1_1_i_client.eps
├── interface_satori_1_1_i_client.tex
├── interface_satori_1_1_i_http_adapter.eps
├── interface_satori_1_1_i_http_adapter.tex
├── interface_satori_1_1_i_logger.tex
├── interface_satori_1_1_i_protobuf_any.tex
├── interface_satori_1_1_i_rpc_status.tex
├── interface_satori_1_1_i_session.eps
├── interface_satori_1_1_i_session.tex
├── longtable_doxygen.sty
├── md__c_h_a_n_g_e_l_o_g.tex
├── md__r_e_a_d_m_e.tex
├── md__r_e_l_e_a_s_e_i_n_s_t.tex
├── md__satori__tests__r_e_a_d_m_e.tex
├── md_codegen__r_e_a_d_m_e.tex
├── namespace_nakama.tex
├── namespace_nakama_1_1_console.tex
├── namespace_nakama_1_1_ninja.tex
├── namespace_nakama_1_1_ninja_1_1_web_sockets.tex
├── namespace_nakama_1_1_ninja_1_1_web_sockets_1_1_exceptions.tex
├── namespace_nakama_1_1_ninja_1_1_web_sockets_1_1_internal.tex
├── namespace_nakama_1_1_tests.tex
├── namespace_nakama_1_1_tests_1_1_api.tex
├── namespace_nakama_1_1_tests_1_1_socket.tex
├── namespace_nakama_1_1_tiny_json.tex
├── namespace_satori.tex
├── namespace_satori_1_1_tests.tex
├── namespace_satori_1_1_tiny_json.tex
├── namespaces.tex
├── refman.tex
└── tabu_doxygen.sty
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# EditorConfig, options: https://editorconfig.org
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.{yml,yaml}]
charset = utf-8
indent_style = space
indent_size = 4
================================================
FILE: .github/workflows/doxygen.yml
================================================
name: Generate Doxygen Docs
on:
push:
branches:
- master
jobs:
doxygen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: mattnotmitt/doxygen-action@1.9.4
with:
working-directory: './docs'
doxyfile-path: 'Doxyfile'
- uses: stefanzweifel/git-auto-commit-action@v4.15.1
with:
commit_message: Update Doxygen docs
================================================
FILE: .github/workflows/pr.yml
================================================
name: Checkout and Test
on:
pull_request:
jobs:
test:
# disabled
if: false
runs-on: ubuntu-latest
steps:
- name: Checkout nakama-dotnet
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
repository: heroiclabs/nakama-dotnet
- name: Checkout nakama-client-testrunner
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
repository: heroiclabs/nakama-client-testrunner
- name: Start docker containers for nakama-client-testrunner
working-directory: nakama-client-testrunner
run: ./docker-compose up -d --wait
- name: Run tests for nakama-dotnet
working-directory: nakama-dotnet
run: dotnet test Nakama.Tests
================================================
FILE: .gitignore
================================================
Nakama.sln.DotSettings
.env
.task/
# Created by https://www.gitignore.io/api/cake,linux,macos,csharp,windows,monodevelop,intellij+all,visualstudio,visualstudiocode
# Edit at https://www.gitignore.io/?templates=cake,linux,macos,csharp,windows,monodevelop,intellij+all,visualstudio,visualstudiocode
### Cake ###
tools/*
!tools/packages.config
### Csharp ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
### Intellij+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
# JetBrains templates
**___jb_tmp___
### Intellij+all Patch ###
# Ignores the whole .idea folder and all .iml files
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
.idea/
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
*.iml
modules.xml
.idea/misc.xml
*.ipr
# Sonarlint plugin
.idea/sonarlint
### Linux ###
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### MonoDevelop ###
#User Specific
*.usertasks
#Mono Project Files
*.resources
test-results/
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
### Windows ###
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
### VisualStudio ###
# User-specific files
# User-specific files (MonoDevelop/Xamarin Studio)
# Mono auto generated files
# Build results
# Visual Studio 2015/2017 cache/options directory
# Uncomment if you have tasks that create the project's static files in wwwroot
# Visual Studio 2017 auto generated files
# MSTest test Results
# NUNIT
# Build Results of an ATL Project
# Benchmark Results
# .NET Core
# StyleCop
# Files built by Visual Studio
# Chutzpah Test files
# Visual C++ cache files
# Visual Studio profiler
# Visual Studio Trace Files
# TFS 2012 Local Workspace
# Guidance Automation Toolkit
# ReSharper is a .NET coding add-in
# JustCode is a .NET coding add-in
# TeamCity is a build add-in
# DotCover is a Code Coverage Tool
# AxoCover is a Code Coverage Tool
# Visual Studio code coverage results
# NCrunch
# MightyMoose
# Web workbench (sass)
# Installshield output folder
# DocProject is a documentation generator add-in
# Click-Once directory
# Publish Web Output
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
# NuGet Packages
# The packages folder can be ignored because of Package Restore
# except build/, which is used as an MSBuild target.
# Uncomment if necessary however generally it will be regenerated when needed
# NuGet v3's project.json files produces more ignorable files
# Microsoft Azure Build Output
# Microsoft Azure Emulator
# Windows Store app package directories and files
# Visual Studio cache files
# files ending in .cache can be ignored
# but keep track of directories ending in .cache
# Others
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
# RIA/Silverlight projects
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
# SQL Server files
# Business Intelligence projects
# Microsoft Fakes
# GhostDoc plugin setting file
# Node.js Tools for Visual Studio
# Visual Studio 6 build log
# Visual Studio 6 workspace options file
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
# Visual Studio LightSwitch build output
# Paket dependency manager
# FAKE - F# Make
# CodeRush personal settings
# Python Tools for Visual Studio (PTVS)
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
# Telerik's JustMock configuration file
# BizTalk build output
# OpenCover UI analysis results
# Azure Stream Analytics local run output
# MSBuild Binary and Structured Log
# NVidia Nsight GPU debugger configuration file
# MFractors (Xamarin productivity tool) working folder
# Local History for Visual Studio
# BeatPulse healthcheck temp database
# Backup folder for Package Reference Convert tool in Visual Studio 2017
# End of https://www.gitignore.io/api/cake,linux,macos,csharp,windows,monodevelop,intellij+all,visualstudio,visualstudiocode
================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [3.21.2] - 2026-02-13
### Changed
- Nakama+Satori: Improve how HTTP requests are logged in the request adapter.
### Fixed
- Satori: Fix argument order to client "GetFlagOverrides" function.
- Nakama+Satori: Fix proto dependency resolver within build task.
## [3.21.1] - 2025-12-21
### Fixed
- Embed README into Nuget package distribution with correct file path.
- Satori: Use correct argument order with GetFlags after code generator changes.
## [3.21.0] - 2025-12-07
### Added
- Satori: Add phase name and phase variant info to Experiment return types.
- Satori: Add message IDs as optional filter input when Messages are listed.
### Changed
- Nakama: Suppress WebSocket exception race condition on graceful socket closure with Unity/Mono runtime.
- Nakama+Satori: Update various Nuget dependencies used in Test profile.
### Fixed
- Nakama: Work around issue in Unity IL2CPP with broader use of Preserve annotation on stream types.
## [3.20.0] - 2025-10-01
### Added
- Nakama: New "ConsoleClient" functions to make HTTP requests to the Nakama Console.
### Fixed
- Satori: Avoid recursive calls to GetFlags overload functions.
## [3.19.0] - 2025-09-29
### Added
- Satori: Enable logger to be passed into the "HttpRequestAdapter."
- Satori: Update client with latest "JoinLiveEventAsync" feature.
### Changed
- Use [Task](https://taskfile.dev/) as the task runner for codegen, build, and publish commands.
- Pin the Protobuf plugins used to generate the Swagger spec used by the codegen tool.
## [3.18.0] - 2025-09-01
### Changed
- Nakama: If the server sends a close frame control message, gracefully respond with close output from the socket.
- Satori: Make "Update" method public in Satori "Session" type.
- Nakama+Satori: Expose "TimeoutException" when CTS timeout occurs within "HttpRequestAdapter."
## [3.17.0] - 2025-07-16
### Added
- Nakama: New Realtime Parties search feature which allows open parties to be discovered by users.
### Changed
- Nakama+Satori: TinyJson will now encode any "IDictionary<,>" type.
### Fixed
- Nakama: "ListStorageObjectsAsync" can use a user ID as input to fetch public storage objects for that user. Thanks @chrisanicolaou.
- Nakama+Satori: Fix how issue at time is decoded from Session token.
## [3.16.0] - 2025-02-13
### Added
- Satori: Update the Client type with the newest Satori API. See [release notes](https://heroiclabs.com/docs/satori/concepts/introduction/release-notes/).
### Changed
- Nakama+Satori: Embed version information based on Git describe into builds.
### Fixed
- Nakama+Satori: Use formatted arguments with all logger lines in request adapters.
- Satori: Use session token as jitter seed for randomized backoff with retries.
- Nakama: "ISession.CreateTime" now accurately represents Unix time in seconds since the "ISession" object was created.
## [3.15.0] - 2025-01-28
### Added
- Satori: Add retry attempts to "Client" type.
### Changed
- Nakama: Improve how cancellation is handled in HTTP requests.
- Satori: Improve how cancellation is handled in HTTP requests.
- Satori: Timeouts set in "Client" are now propagated to the underlying "ApiClient" type.
### Fixed
- GitHub Pages documentation no longer uses Jekyll transform.
## [3.14.0] - 2024-10-20
### Added
- Satori: New "IClient" event called "ReceivedSessionUpdated" when session expires and is refreshed.
### Changed
- Satori: The new session returned by "IdentifyAsync" is merged into the input "Session" type.
## [3.13.0] - 2024-07-10
### Added
- Satori: Added "ImageUrl" and "Title" to "IApiMessage".
## [3.12.1] - 2024-05-30
### Fixed
- Nakama: Fixed an issue where notifications from other users could appear as if they were sent by the recipient user.
- Nakama: Fixed a potential "NullReferenceException" that could occur when passing a "null" username to "IClient.UpdateAccountAsync".
## [3.12.0] - 2024-04-08
### Added
- Satori: Added "IApiLiveEvent.Id" for accessing live event identifiers.
- Satori: Added support for new Satori Messages API: "IClient.GetMessageListAsync", "IClient.UpdateMessageAsync" and "IClient.DeleteMessageAsync".
## [3.11.0] - 2024-03-08
### Added
- Nakama: New "IClient" event called "ReceivedSessionUpdated" when session expires and is refreshed.
- Nakama: New "Session.Update" method to allow for in-place updates to the session object.
### Changed
- Nakama: "IsConnected" and "IsConnecting" will now read directly from the underlying .NET socket status. This will allow application code to more quickly and easily detect connectivity loss arising from a lack of internet access.
- Nakama: Default socket adapter changed from "WebSocketAdapter" to "WebSocketStdlibAdapter". This was done to utilize the native .NET Websocket library for improved stability and maintenance.
### Fixed
- Nakama: Trying to connect a socket that is already connecting now results in a no-op instead of an error.
## [3.10.0] - 2023-11-21
### Changed
- Nakama: Mark socket as connected before event handler is called.
- Nakama: Limited scope of retry logic to very specific 500-level codes from the server.
### Added
- Nakama: Rank count is now returned with tournament record listings.
- Nakama: Added ability to delete tournament records with "DeleteTournamentRecordAsync".
- Nakama: Hostnames passed to the client now preserve their hardcoded paths.
- Nakama: Create and update times are now returned with notifications.
- Nakama: Added Facebook Instant Games purchase validation.
## [3.9.0]
### Added
- Satori: Added "recompute" option to "UpdatePropertiesAsync" which allows audiences to be recalculated on property update.
### Changed
- Satori: Decreased size of JSON payloads.
### Fixed
- Satori: "DeleteIdentityAsync" no longer accepts an explicit ID.
## [3.8.0]
### Added
- Nakama: Added "Authoritative" flag to tournaments returned from the server.
- Nakama: Added "RefundTime" and "UserId" to purchases and subscriptions returned from the server.
- Nakama: Added raw subscription provider information.
- Nakama: Added "DeleteAccountAsync" for deleting user accounts.
- Satori: Added "DeleteIdentityAsync" for deleting user identities.
### Changed
- Nakama: Used "session.Username" wherever outdated state might be returned.
### Fixed
- Nakama: Fixed issue where outgoing payloads could include unnecessary JSON.
## [3.7.0]
### Added
- Nakama: Added a "UpdatePresences" utility to "IMatch" and "IParty". Use this method to maintain the presences in your matches and parties
when an "IMatchPresenceEvent" or "IPartyPresenceEvent" is dispatched.
- Satori: Added optional default and custom properties that can be attached to authentication requests.
### Changed
- Satori: "GetFlagDefault" and "GetFlagsDefault" now use the "apiKey" passed to the client constructor rather than accepting it as a unique parameter.
## [3.6.0]
### Added
- Satori: Adds the Satori .NET SDK. Satori is our liveops server for game studios. Please read more about it on the Heroic Labs website.
- Nakama: Adds support for calling RPCs with a HTTP key via POST when a payload is provided.
- Nakama: Expose the "Logger" object on "IClient".
- Nakama: Adds support for POST RPC requests when using HTTP key with a payload
### Fixed
- Nakama: Prevent race condition when "Close" is called while receive loop has an incomplete read buffer.
- Nakama: Fixed an issue where 500 errors could cause parsing issues on the client.
- Nakama: Added ability to specify "path" parameter to client urls.
### Changed
- Nakama: Fixed an issue where our websocket would throw an exception on "CloseAsync()" in certain situations.
## [3.5.0] - 2022-09-06
### Added
- Ability to "persist" Apple, Huawei, and Google purchase receipts in the Nakama database. This is set to "true" by default in order to allow the server to detect replay attacks.
- Added a "SeenBefore" property to "IApiValidatedPurchase".
- Added "ListSubscriptionsAsync" which returns a list of the user's subscriptions.
- Added "ValidateSubscriptionAppleAsync" which returns details about a user's Apple subscription.
- Added "ValidateSubscriptionGoogleAsync" which returns details about a user's Google subscription.
- Added "GetSubscriptionAsync" which returns a subscription for the provided product id.
- Added support for "countMultiple" in "AddMatchmakerAsync" and "AddMatchmakerPartyAsync".
### Changed
- "ValidatedPurchaseEnvironment" has been renamed to "ApiStoreEnvironment".
- "ValidatedPurchaseStore" has been renamed to "ApiStoreProvider".
- Removed obsolete client methods that accept a "CancellationTokenSource". These have been replaced in favor of methods that accept a "CancellationToken" that were added in v3.3.
### Fixed
- Fixed an issue with Socket Closed event taking a significant length of time or not firing at all when internet connection is lost.
- Fixed an issue with "SocketClosed" event taking a significant length of time or not firing at all when internet connection is lost.
- Fixed an issue that would occur when sending messages over the socket from multiple threads.
- Fixed automatic retry seeding to be random across devices.
- Fixed an issue when parsing unquoted numbers as strings in TinyJson.
## [3.4.0] - 2022-04-28
### Added
- Allow max message size limit with socket messages to be overridden in the adapter.
- Relayed multiplayer matches can now be created with a custom name (i.e. room name).
### Fixed
- Fix background read loop to update 'IsConnecting' and 'IsConnected' when close is detected.
## [3.3.0] - 2022-01-24
### Added
- Add overload methods in Client which take a CancellationToken. Thanks @gamecentric.
- Add WebSocketStdlibAdapter allows the codebase to be used in WASM and Blazor projects. Thanks @mattkanwisher.
### Changed
- Use DualMode in TcpClient to handle NAT64 overlay networks (some mobile carriers).
- Refactor the socket adapter design to use Tasks (previously avoided for Unity WebGL compat.).
- Socket messages which exceed the internal buffer size now generate an "InternalBufferOverflowException" type.
- A socket connect made on an already connected socket will no longer raise an exception.
- Propagate up the "WebSocketException" type thrown on socket messages sent over a disconnected socket.
- Update bundled "Ninja.WebSockets" library to commit 0b698a733f0e8711da7a5854154fe7d8a01fbd06.
### Fixed
- Expose base exception if retry handler fails.
## [3.2.0] - 2021-10-11
### Added
- Added additional group listing filters.
- Added ability to overwrite leaderboard/tournament ranking operators from the client.
### Fixed
- Fixed url-safe encoding of query params that were passed to the client as arrays of strings.
## [3.1.1] - 2021-08-19
### Changed
- Removed "autoRefreshSession" from overloaded "Client" constructors. This can still be customized with the base "Client" constructor. This is a workaround for an internal compiler error in Unity's WebGL toolchain.
## [3.1.0] - 2021-08-11
### Added
- Added ability for user to retry requests if they fail due to a transient network error.
- Added ability for user to cancel requests that are in-flight.
## [3.0.0] - 2021-07-14
### Added
- The language tag for the user can be configured with the socket on connect.
### Changed
- An "IPartyMatchmakerTicket" is now received by the party leader when they add their party to the matchmaker via "AddMatchmakerPartyAsync".
- Renamed "PromotePartyMember" to "PromotePartyMemberAsync".
## [2.9.3] - 2021-06-17
### Fixed
- Fixed issue where refreshing a session with metadata threw an exception due to the key already existing.
## [2.9.2] - 2021-05-21
### Fixed
- Fixed issue where "IUserPresence" objects were not being deserialized properly by the client as part of the "IParty" object.
### Changed
- AddMatchmakerPartyAsync now returns an IPartyMatchmakerTicket.
- Renamed PromotePartyMember to PromotePartyMemberAsync.
## [2.9.1] - 2021-05-19
### Added
- The "Socket.ReceivedParty" event can now be subscribed to in order to listen for acceptance events from the leader of a closed party.
## [2.9.0] - 2021-05-15
### Added
- A session can be refreshed on demand with "SessionRefreshAsync" method.
- Session and/or refresh tokens can now be disabled with a client logout.
- The client now supports session auto-refresh using refresh tokens. This is enabled by default.
- New socket RPC and MatchSend methods using ArraySegment to allow developers to manage memory re-use.
- Add IAP validation APIs for purchase receipts with Apple App Store, Google Play Store, and Huawei AppGallery.
- Add Realtime Parties feature.
### Changed
- Use lock object with socket operations instead of ConcurrentDictionary as a workaround for a Unity engine WebGL regression.
- Avoid use of extension methods as a workaround for a Unity engine WebGL regression.
### Fixed
- Parse HTTP responses defensively in case of bad load balancer configurations.
## [2.8.0] - 2020-02-19
### Changed
- Listing tournaments can now be done without providing start or end time filters.
- Can now import Steam friends after authenticating or linking to a Steam account.
## [2.7.1] - 2020-02-1
### Fixed
- HTTP Client now properly reads off timeout value.
## [2.7.0] - 2020-10-19
### Changed
- Upgrade code generator to new Swagger format.
### Fixed
- Properly pass server key to Apple auth calls.
## [2.6.0] - 2020-09-21
### Added
- Added Apple single sign-on support.
- Added Steam single sign-on support.
### Fixed
- Fixed serialization of HTTP API error messages.
### Changed
- Silenced a noisy but benign exception related to web socket connections.
## [2.5.0] - 2020-08-12
### Added
- Add parsing support for the Nakama Console API to the code generator.
- Add support for emitting custom events to the Nakama server.
- Add ban and demote API to the client.
### Changed
- Update TinyJson packaged dependency to the '01c586d' commit.
- Remove usage of "System.Diagnostic.Tracing" from the codebase. This improves compatibility with Unity engine.
- Use a Preserve annotation to mark fields which should not be code stripped at build time. This improves compatibility with Unity engine.
## [2.4.0] - 2020-05-04 :star:
### Added
- New ListStorageObjectsAsync method and marked ListStorageObjects as obsolete.
### Changed
- ListUsersStorageObjectsAsync now uses default arguments for optional inputs.
### Fixed
- Prevent InvalidOperationException caused when socket connect task is already completed.
## [2.3.1] - 2019-09-21
### Changed
- Use workaround for IPv6 bug in TcpClient with Mono runtime used with Unity engine.
### Fixed
- Add missing metadata to match join message.
- Add discrete channel identifier in all channel related messages.
## [2.3.0] - 2019-09-02
### Added
- Follow users by username for status updates.
- Decode session variables from the auth token.
- Paginate friends, groups, and user's group listings.
- Filter friends, groups, and user's group listings.
- Send session variables with authenticate requests.
- Socket messages now use a send timeout of 15 seconds to write to the buffer.
### Changed
- Increase the default socket timeout to 30 seconds.
### Fixed
- Use the connect timeout value in native socket connect attempts.
- Link the token source across socket connect and close tasks.
## [2.2.2] - 2019-07-02
### Changed
- Don't synchronize the socket receive with the current thread context.
- Remove workaround for Mono runtime usage with newer TLS negotation.
### Fixed
- Resolve deadlock in socket dispose with synchronization context.
## [2.2.1] - 2019-06-19
### Added
- New comparison methods on some domain types.
### Changed
- When an auth token is decoded into a session but is null or empty now return null.
### Fixed
- Awaited socket callback tasks are now canceled when the socket adapter is closed and cleared.
- Awaited socket callback tasks are now canceled when the socket adapter sends while disconnected.
- Restored missing helper object with storage writes.
## [2.2.0] - 2019-06-06
### Added
- Add tournaments API.
- Add leaderboards around owner API.
- Provide more overload methods to the socket object for simpler usage.
### Changed
- Update TinyJson packaged dependency to latest version.
- Replace WebSocketListener with a new socket library.
- Flatten use of Tasks in method responses.
### Fixed
- Logger is now initialized correctly with socket debugging.
- Stream data state is correctly deserialized from socket messages.
- Fix callback ID on chat and match leave messages.
## [2.1.0] - 2018-08-17
### Added
- Detect socket message encodings.
- All authenticate methods can now pass in username and create options.
- Support gzip compress/decompress on ApiClient methods.
### Changed
- Update the code generator to handle POST/DELETE query params.
- Match listings can now pass through "null" to indicate no filters.
- ApiClient exceptions now contain HTTP status codes.
- Update lowlevel websocket driver due to performance issues on AOT targets like iOS with Unity.
- Disable request decompression by default due to Unity+Android issue.
### Fixed
- Reuse the HTTP client across all methods.
## [2.0.0] - 2018-06-18
### Added
- Initial public release.
This version starts at 2.0 to match the initial server version it supports.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Nakama/ApiClient.gen.cs
================================================
/* Code generated by codegen/main.go. DO NOT EDIT. */
namespace Nakama
{
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TinyJson;
///
/// An exception generated for HttpResponse objects don't return a success status.
///
public sealed class ApiResponseException : Exception
{
public long StatusCode { get; }
public int GrpcStatusCode { get; }
public ApiResponseException(long statusCode, string content, int grpcCode) : base(content)
{
StatusCode = statusCode;
GrpcStatusCode = grpcCode;
}
public ApiResponseException(string message, Exception e) : base(message, e)
{
StatusCode = -1L;
GrpcStatusCode = -1;
}
public ApiResponseException(string content) : this(-1L, content, -1)
{
}
public override string ToString()
{
return $"ApiResponseException(StatusCode={StatusCode}, Message='{Message}', GrpcStatusCode={GrpcStatusCode})";
}
}
///
/// Update fields in a given group.
///
public interface IApiUpdateGroupRequest
{
///
/// Avatar URL.
///
string AvatarUrl { get; }
///
/// Description string.
///
string Description { get; }
///
/// Lang tag.
///
string LangTag { get; }
///
/// Name.
///
string Name { get; }
///
/// Open is true if anyone should be allowed to join, or false if joins must be approved by a group admin.
///
bool Open { get; }
}
///
internal class ApiUpdateGroupRequest : IApiUpdateGroupRequest
{
///
[DataMember(Name="avatar_url"), Preserve]
public string AvatarUrl { get; set; }
///
[DataMember(Name="description"), Preserve]
public string Description { get; set; }
///
[DataMember(Name="lang_tag"), Preserve]
public string LangTag { get; set; }
///
[DataMember(Name="name"), Preserve]
public string Name { get; set; }
///
[DataMember(Name="open"), Preserve]
public bool Open { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "AvatarUrl: ", AvatarUrl, ", ");
output = string.Concat(output, "Description: ", Description, ", ");
output = string.Concat(output, "LangTag: ", LangTag, ", ");
output = string.Concat(output, "Name: ", Name, ", ");
output = string.Concat(output, "Open: ", Open, ", ");
return output;
}
}
///
/// A friend of a friend.
///
public interface IFriendsOfFriendsListFriendOfFriend
{
///
/// The user who referred its friend.
///
string Referrer { get; }
///
/// User.
///
IApiUser User { get; }
}
///
internal class FriendsOfFriendsListFriendOfFriend : IFriendsOfFriendsListFriendOfFriend
{
///
[DataMember(Name="referrer"), Preserve]
public string Referrer { get; set; }
///
[IgnoreDataMember]
public IApiUser User => _user;
[DataMember(Name="user"), Preserve]
public ApiUser _user { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Referrer: ", Referrer, ", ");
output = string.Concat(output, "User: ", User, ", ");
return output;
}
}
///
/// A single user-role pair.
///
public interface IGroupUserListGroupUser
{
///
/// Their relationship to the group.
///
int State { get; }
///
/// User.
///
IApiUser User { get; }
}
///
internal class GroupUserListGroupUser : IGroupUserListGroupUser
{
///
[DataMember(Name="state"), Preserve]
public int State { get; set; }
///
[IgnoreDataMember]
public IApiUser User => _user;
[DataMember(Name="user"), Preserve]
public ApiUser _user { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "State: ", State, ", ");
output = string.Concat(output, "User: ", User, ", ");
return output;
}
}
///
/// A single group-role pair.
///
public interface IUserGroupListUserGroup
{
///
/// Group.
///
IApiGroup Group { get; }
///
/// The user's relationship to the group.
///
int State { get; }
}
///
internal class UserGroupListUserGroup : IUserGroupListUserGroup
{
///
[IgnoreDataMember]
public IApiGroup Group => _group;
[DataMember(Name="group"), Preserve]
public ApiGroup _group { get; set; }
///
[DataMember(Name="state"), Preserve]
public int State { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Group: ", Group, ", ");
output = string.Concat(output, "State: ", State, ", ");
return output;
}
}
///
/// Record values to write.
///
public interface IWriteLeaderboardRecordRequestLeaderboardRecordWrite
{
///
/// Optional record metadata.
///
string Metadata { get; }
///
/// Operator override.
///
ApiOperator Operator { get; }
///
/// The score value to submit.
///
string Score { get; }
///
/// An optional secondary value.
///
string Subscore { get; }
}
///
internal class WriteLeaderboardRecordRequestLeaderboardRecordWrite : IWriteLeaderboardRecordRequestLeaderboardRecordWrite
{
///
[DataMember(Name="metadata"), Preserve]
public string Metadata { get; set; }
///
[IgnoreDataMember]
public ApiOperator Operator => _operator;
[DataMember(Name="operator"), Preserve]
public ApiOperator _operator { get; set; }
///
[DataMember(Name="score"), Preserve]
public string Score { get; set; }
///
[DataMember(Name="subscore"), Preserve]
public string Subscore { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Metadata: ", Metadata, ", ");
output = string.Concat(output, "Operator: ", Operator, ", ");
output = string.Concat(output, "Score: ", Score, ", ");
output = string.Concat(output, "Subscore: ", Subscore, ", ");
return output;
}
}
///
/// Record values to write.
///
public interface IWriteTournamentRecordRequestTournamentRecordWrite
{
///
/// A JSON object of additional properties (optional).
///
string Metadata { get; }
///
/// Operator override.
///
ApiOperator Operator { get; }
///
/// The score value to submit.
///
string Score { get; }
///
/// An optional secondary value.
///
string Subscore { get; }
}
///
internal class WriteTournamentRecordRequestTournamentRecordWrite : IWriteTournamentRecordRequestTournamentRecordWrite
{
///
[DataMember(Name="metadata"), Preserve]
public string Metadata { get; set; }
///
[IgnoreDataMember]
public ApiOperator Operator => _operator;
[DataMember(Name="operator"), Preserve]
public ApiOperator _operator { get; set; }
///
[DataMember(Name="score"), Preserve]
public string Score { get; set; }
///
[DataMember(Name="subscore"), Preserve]
public string Subscore { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Metadata: ", Metadata, ", ");
output = string.Concat(output, "Operator: ", Operator, ", ");
output = string.Concat(output, "Score: ", Score, ", ");
output = string.Concat(output, "Subscore: ", Subscore, ", ");
return output;
}
}
///
/// A user with additional account details. Always the current user.
///
public interface IApiAccount
{
///
/// The custom id in the user's account.
///
string CustomId { get; }
///
/// The devices which belong to the user's account.
///
IEnumerable Devices { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's account was disabled/banned.
///
string DisableTime { get; }
///
/// The email address of the user.
///
string Email { get; }
///
/// The user object.
///
IApiUser User { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's email was verified.
///
string VerifyTime { get; }
///
/// The user's wallet data.
///
string Wallet { get; }
}
///
internal class ApiAccount : IApiAccount
{
///
[DataMember(Name="custom_id"), Preserve]
public string CustomId { get; set; }
///
[IgnoreDataMember]
public IEnumerable Devices => _devices ?? new List(0);
[DataMember(Name="devices"), Preserve]
public List _devices { get; set; }
///
[DataMember(Name="disable_time"), Preserve]
public string DisableTime { get; set; }
///
[DataMember(Name="email"), Preserve]
public string Email { get; set; }
///
[IgnoreDataMember]
public IApiUser User => _user;
[DataMember(Name="user"), Preserve]
public ApiUser _user { get; set; }
///
[DataMember(Name="verify_time"), Preserve]
public string VerifyTime { get; set; }
///
[DataMember(Name="wallet"), Preserve]
public string Wallet { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "CustomId: ", CustomId, ", ");
output = string.Concat(output, "Devices: [", string.Join(", ", Devices), "], ");
output = string.Concat(output, "DisableTime: ", DisableTime, ", ");
output = string.Concat(output, "Email: ", Email, ", ");
output = string.Concat(output, "User: ", User, ", ");
output = string.Concat(output, "VerifyTime: ", VerifyTime, ", ");
output = string.Concat(output, "Wallet: ", Wallet, ", ");
return output;
}
}
///
/// Send a Apple Sign In token to the server. Used with authenticate/link/unlink.
///
public interface IApiAccountApple
{
///
/// The ID token received from Apple to validate.
///
string Token { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountApple : IApiAccountApple
{
///
[DataMember(Name="token"), Preserve]
public string Token { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Token: ", Token, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send a custom ID to the server. Used with authenticate/link/unlink.
///
public interface IApiAccountCustom
{
///
/// A custom identifier.
///
string Id { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountCustom : IApiAccountCustom
{
///
[DataMember(Name="id"), Preserve]
public string Id { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Id: ", Id, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send a device to the server. Used with authenticate/link/unlink and user.
///
public interface IApiAccountDevice
{
///
/// A device identifier. Should be obtained by a platform-specific device API.
///
string Id { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountDevice : IApiAccountDevice
{
///
[DataMember(Name="id"), Preserve]
public string Id { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Id: ", Id, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send an email with password to the server. Used with authenticate/link/unlink.
///
public interface IApiAccountEmail
{
///
/// A valid RFC-5322 email address.
///
string Email { get; }
///
/// A password for the user account. Ignored with unlink operations.
///
string Password { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountEmail : IApiAccountEmail
{
///
[DataMember(Name="email"), Preserve]
public string Email { get; set; }
///
[DataMember(Name="password"), Preserve]
public string Password { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Email: ", Email, ", ");
output = string.Concat(output, "Password: ", Password, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send a Facebook token to the server. Used with authenticate/link/unlink.
///
public interface IApiAccountFacebook
{
///
/// The OAuth token received from Facebook to access their profile API.
///
string Token { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountFacebook : IApiAccountFacebook
{
///
[DataMember(Name="token"), Preserve]
public string Token { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Token: ", Token, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send a Facebook Instant Game token to the server. Used with authenticate/link/unlink.
///
public interface IApiAccountFacebookInstantGame
{
///
/// The OAuth token received from a Facebook Instant Game that may be decoded with the Application Secret (must be available with the nakama configuration)
///
string SignedPlayerInfo { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountFacebookInstantGame : IApiAccountFacebookInstantGame
{
///
[DataMember(Name="signed_player_info"), Preserve]
public string SignedPlayerInfo { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "SignedPlayerInfo: ", SignedPlayerInfo, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send Apple's Game Center account credentials to the server. Used with authenticate/link/unlink. https://developer.apple.com/documentation/gamekit/gklocalplayer/1515407-generateidentityverificationsign
///
public interface IApiAccountGameCenter
{
///
/// Bundle ID (generated by GameCenter).
///
string BundleId { get; }
///
/// Player ID (generated by GameCenter).
///
string PlayerId { get; }
///
/// The URL for the public encryption key.
///
string PublicKeyUrl { get; }
///
/// A random "NSString" used to compute the hash and keep it randomized.
///
string Salt { get; }
///
/// The verification signature data generated.
///
string Signature { get; }
///
/// Time since UNIX epoch when the signature was created.
///
string TimestampSeconds { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountGameCenter : IApiAccountGameCenter
{
///
[DataMember(Name="bundle_id"), Preserve]
public string BundleId { get; set; }
///
[DataMember(Name="player_id"), Preserve]
public string PlayerId { get; set; }
///
[DataMember(Name="public_key_url"), Preserve]
public string PublicKeyUrl { get; set; }
///
[DataMember(Name="salt"), Preserve]
public string Salt { get; set; }
///
[DataMember(Name="signature"), Preserve]
public string Signature { get; set; }
///
[DataMember(Name="timestamp_seconds"), Preserve]
public string TimestampSeconds { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "BundleId: ", BundleId, ", ");
output = string.Concat(output, "PlayerId: ", PlayerId, ", ");
output = string.Concat(output, "PublicKeyUrl: ", PublicKeyUrl, ", ");
output = string.Concat(output, "Salt: ", Salt, ", ");
output = string.Concat(output, "Signature: ", Signature, ", ");
output = string.Concat(output, "TimestampSeconds: ", TimestampSeconds, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send a Google token to the server. Used with authenticate/link/unlink.
///
public interface IApiAccountGoogle
{
///
/// The OAuth token received from Google to access their profile API.
///
string Token { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountGoogle : IApiAccountGoogle
{
///
[DataMember(Name="token"), Preserve]
public string Token { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Token: ", Token, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// Send a Steam token to the server. Used with authenticate/link/unlink.
///
public interface IApiAccountSteam
{
///
/// The account token received from Steam to access their profile API.
///
string Token { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiAccountSteam : IApiAccountSteam
{
///
[DataMember(Name="token"), Preserve]
public string Token { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Token: ", Token, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// A message sent on a channel.
///
public interface IApiChannelMessage
{
///
/// The channel this message belongs to.
///
string ChannelId { get; }
///
/// The code representing a message type or category.
///
int Code { get; }
///
/// The content payload.
///
string Content { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the message was created.
///
string CreateTime { get; }
///
/// The ID of the group, or an empty string if this message was not sent through a group channel.
///
string GroupId { get; }
///
/// The unique ID of this message.
///
string MessageId { get; }
///
/// True if the message was persisted to the channel's history, false otherwise.
///
bool Persistent { get; }
///
/// The name of the chat room, or an empty string if this message was not sent through a chat room.
///
string RoomName { get; }
///
/// Message sender, usually a user ID.
///
string SenderId { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the message was last updated.
///
string UpdateTime { get; }
///
/// The ID of the first DM user, or an empty string if this message was not sent through a DM chat.
///
string UserIdOne { get; }
///
/// The ID of the second DM user, or an empty string if this message was not sent through a DM chat.
///
string UserIdTwo { get; }
///
/// The username of the message sender, if any.
///
string Username { get; }
}
///
internal class ApiChannelMessage : IApiChannelMessage
{
///
[DataMember(Name="channel_id"), Preserve]
public string ChannelId { get; set; }
///
[DataMember(Name="code"), Preserve]
public int Code { get; set; }
///
[DataMember(Name="content"), Preserve]
public string Content { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="group_id"), Preserve]
public string GroupId { get; set; }
///
[DataMember(Name="message_id"), Preserve]
public string MessageId { get; set; }
///
[DataMember(Name="persistent"), Preserve]
public bool Persistent { get; set; }
///
[DataMember(Name="room_name"), Preserve]
public string RoomName { get; set; }
///
[DataMember(Name="sender_id"), Preserve]
public string SenderId { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[DataMember(Name="user_id_one"), Preserve]
public string UserIdOne { get; set; }
///
[DataMember(Name="user_id_two"), Preserve]
public string UserIdTwo { get; set; }
///
[DataMember(Name="username"), Preserve]
public string Username { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "ChannelId: ", ChannelId, ", ");
output = string.Concat(output, "Code: ", Code, ", ");
output = string.Concat(output, "Content: ", Content, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "GroupId: ", GroupId, ", ");
output = string.Concat(output, "MessageId: ", MessageId, ", ");
output = string.Concat(output, "Persistent: ", Persistent, ", ");
output = string.Concat(output, "RoomName: ", RoomName, ", ");
output = string.Concat(output, "SenderId: ", SenderId, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "UserIdOne: ", UserIdOne, ", ");
output = string.Concat(output, "UserIdTwo: ", UserIdTwo, ", ");
output = string.Concat(output, "Username: ", Username, ", ");
return output;
}
}
///
/// A list of channel messages, usually a result of a list operation.
///
public interface IApiChannelMessageList
{
///
/// Cacheable cursor to list newer messages. Durable and designed to be stored, unlike next/prev cursors.
///
string CacheableCursor { get; }
///
/// A list of messages.
///
IEnumerable Messages { get; }
///
/// The cursor to send when retrieving the next page, if any.
///
string NextCursor { get; }
///
/// The cursor to send when retrieving the previous page, if any.
///
string PrevCursor { get; }
}
///
internal class ApiChannelMessageList : IApiChannelMessageList
{
///
[DataMember(Name="cacheable_cursor"), Preserve]
public string CacheableCursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable Messages => _messages ?? new List(0);
[DataMember(Name="messages"), Preserve]
public List _messages { get; set; }
///
[DataMember(Name="next_cursor"), Preserve]
public string NextCursor { get; set; }
///
[DataMember(Name="prev_cursor"), Preserve]
public string PrevCursor { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "CacheableCursor: ", CacheableCursor, ", ");
output = string.Concat(output, "Messages: [", string.Join(", ", Messages), "], ");
output = string.Concat(output, "NextCursor: ", NextCursor, ", ");
output = string.Concat(output, "PrevCursor: ", PrevCursor, ", ");
return output;
}
}
///
/// Create a group with the current user as owner.
///
public interface IApiCreateGroupRequest
{
///
/// A URL for an avatar image.
///
string AvatarUrl { get; }
///
/// A description for the group.
///
string Description { get; }
///
/// The language expected to be a tag which follows the BCP-47 spec.
///
string LangTag { get; }
///
/// Maximum number of group members.
///
int MaxCount { get; }
///
/// A unique name for the group.
///
string Name { get; }
///
/// Mark a group as open or not where only admins can accept members.
///
bool Open { get; }
}
///
internal class ApiCreateGroupRequest : IApiCreateGroupRequest
{
///
[DataMember(Name="avatar_url"), Preserve]
public string AvatarUrl { get; set; }
///
[DataMember(Name="description"), Preserve]
public string Description { get; set; }
///
[DataMember(Name="lang_tag"), Preserve]
public string LangTag { get; set; }
///
[DataMember(Name="max_count"), Preserve]
public int MaxCount { get; set; }
///
[DataMember(Name="name"), Preserve]
public string Name { get; set; }
///
[DataMember(Name="open"), Preserve]
public bool Open { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "AvatarUrl: ", AvatarUrl, ", ");
output = string.Concat(output, "Description: ", Description, ", ");
output = string.Concat(output, "LangTag: ", LangTag, ", ");
output = string.Concat(output, "MaxCount: ", MaxCount, ", ");
output = string.Concat(output, "Name: ", Name, ", ");
output = string.Concat(output, "Open: ", Open, ", ");
return output;
}
}
///
/// Storage objects to delete.
///
public interface IApiDeleteStorageObjectId
{
///
/// The collection which stores the object.
///
string Collection { get; }
///
/// The key of the object within the collection.
///
string Key { get; }
///
/// The version hash of the object.
///
string Version { get; }
}
///
internal class ApiDeleteStorageObjectId : IApiDeleteStorageObjectId
{
///
[DataMember(Name="collection"), Preserve]
public string Collection { get; set; }
///
[DataMember(Name="key"), Preserve]
public string Key { get; set; }
///
[DataMember(Name="version"), Preserve]
public string Version { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Collection: ", Collection, ", ");
output = string.Concat(output, "Key: ", Key, ", ");
output = string.Concat(output, "Version: ", Version, ", ");
return output;
}
}
///
/// Batch delete storage objects.
///
public interface IApiDeleteStorageObjectsRequest
{
///
/// Batch of storage objects.
///
IEnumerable ObjectIds { get; }
}
///
internal class ApiDeleteStorageObjectsRequest : IApiDeleteStorageObjectsRequest
{
///
[IgnoreDataMember]
public IEnumerable ObjectIds => _objectIds ?? new List(0);
[DataMember(Name="object_ids"), Preserve]
public List _objectIds { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "ObjectIds: [", string.Join(", ", ObjectIds), "], ");
return output;
}
}
///
/// Represents an event to be passed through the server to registered event handlers.
///
public interface IApiEvent
{
///
/// True if the event came directly from a client call, false otherwise.
///
bool External { get; }
///
/// An event name, type, category, or identifier.
///
string Name { get; }
///
/// Arbitrary event property values.
///
IDictionary Properties { get; }
///
/// The time when the event was triggered.
///
string Timestamp { get; }
}
///
internal class ApiEvent : IApiEvent
{
///
[DataMember(Name="external"), Preserve]
public bool External { get; set; }
///
[DataMember(Name="name"), Preserve]
public string Name { get; set; }
///
[IgnoreDataMember]
public IDictionary Properties => _properties ?? new Dictionary();
[DataMember(Name="properties"), Preserve]
public Dictionary _properties { get; set; }
///
[DataMember(Name="timestamp"), Preserve]
public string Timestamp { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "External: ", External, ", ");
output = string.Concat(output, "Name: ", Name, ", ");
var propertiesString = "";
foreach (var kvp in Properties)
{
propertiesString = string.Concat(propertiesString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Properties: [" + propertiesString + "]");
output = string.Concat(output, "Timestamp: ", Timestamp, ", ");
return output;
}
}
///
/// A friend of a user.
///
public interface IApiFriend
{
///
/// Metadata.
///
string Metadata { get; }
///
/// The friend status. one of "Friend.State".
///
int State { get; }
///
/// Time of the latest relationship update.
///
string UpdateTime { get; }
///
/// The user object.
///
IApiUser User { get; }
}
///
internal class ApiFriend : IApiFriend
{
///
[DataMember(Name="metadata"), Preserve]
public string Metadata { get; set; }
///
[DataMember(Name="state"), Preserve]
public int State { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[IgnoreDataMember]
public IApiUser User => _user;
[DataMember(Name="user"), Preserve]
public ApiUser _user { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Metadata: ", Metadata, ", ");
output = string.Concat(output, "State: ", State, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "User: ", User, ", ");
return output;
}
}
///
/// A collection of zero or more friends of the user.
///
public interface IApiFriendList
{
///
/// Cursor for the next page of results, if any.
///
string Cursor { get; }
///
/// The Friend objects.
///
IEnumerable Friends { get; }
}
///
internal class ApiFriendList : IApiFriendList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable Friends => _friends ?? new List(0);
[DataMember(Name="friends"), Preserve]
public List _friends { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "Friends: [", string.Join(", ", Friends), "], ");
return output;
}
}
///
/// A List of friends of friends
///
public interface IApiFriendsOfFriendsList
{
///
/// Cursor for the next page of results, if any.
///
string Cursor { get; }
///
/// User friends of friends.
///
IEnumerable FriendsOfFriends { get; }
}
///
internal class ApiFriendsOfFriendsList : IApiFriendsOfFriendsList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable FriendsOfFriends => _friendsOfFriends ?? new List(0);
[DataMember(Name="friends_of_friends"), Preserve]
public List _friendsOfFriends { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "FriendsOfFriends: [", string.Join(", ", FriendsOfFriends), "], ");
return output;
}
}
///
/// A group in the server.
///
public interface IApiGroup
{
///
/// A URL for an avatar image.
///
string AvatarUrl { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was created.
///
string CreateTime { get; }
///
/// The id of the user who created the group.
///
string CreatorId { get; }
///
/// A description for the group.
///
string Description { get; }
///
/// The current count of all members in the group.
///
int EdgeCount { get; }
///
/// The id of a group.
///
string Id { get; }
///
/// The language expected to be a tag which follows the BCP-47 spec.
///
string LangTag { get; }
///
/// The maximum number of members allowed.
///
int MaxCount { get; }
///
/// Additional information stored as a JSON object.
///
string Metadata { get; }
///
/// The unique name of the group.
///
string Name { get; }
///
/// Anyone can join open groups, otherwise only admins can accept members.
///
bool Open { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was last updated.
///
string UpdateTime { get; }
}
///
internal class ApiGroup : IApiGroup
{
///
[DataMember(Name="avatar_url"), Preserve]
public string AvatarUrl { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="creator_id"), Preserve]
public string CreatorId { get; set; }
///
[DataMember(Name="description"), Preserve]
public string Description { get; set; }
///
[DataMember(Name="edge_count"), Preserve]
public int EdgeCount { get; set; }
///
[DataMember(Name="id"), Preserve]
public string Id { get; set; }
///
[DataMember(Name="lang_tag"), Preserve]
public string LangTag { get; set; }
///
[DataMember(Name="max_count"), Preserve]
public int MaxCount { get; set; }
///
[DataMember(Name="metadata"), Preserve]
public string Metadata { get; set; }
///
[DataMember(Name="name"), Preserve]
public string Name { get; set; }
///
[DataMember(Name="open"), Preserve]
public bool Open { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "AvatarUrl: ", AvatarUrl, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "CreatorId: ", CreatorId, ", ");
output = string.Concat(output, "Description: ", Description, ", ");
output = string.Concat(output, "EdgeCount: ", EdgeCount, ", ");
output = string.Concat(output, "Id: ", Id, ", ");
output = string.Concat(output, "LangTag: ", LangTag, ", ");
output = string.Concat(output, "MaxCount: ", MaxCount, ", ");
output = string.Concat(output, "Metadata: ", Metadata, ", ");
output = string.Concat(output, "Name: ", Name, ", ");
output = string.Concat(output, "Open: ", Open, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
return output;
}
}
///
/// One or more groups returned from a listing operation.
///
public interface IApiGroupList
{
///
/// A cursor used to get the next page.
///
string Cursor { get; }
///
/// One or more groups.
///
IEnumerable Groups { get; }
}
///
internal class ApiGroupList : IApiGroupList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable Groups => _groups ?? new List(0);
[DataMember(Name="groups"), Preserve]
public List _groups { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "Groups: [", string.Join(", ", Groups), "], ");
return output;
}
}
///
/// A list of users belonging to a group, along with their role.
///
public interface IApiGroupUserList
{
///
/// Cursor for the next page of results, if any.
///
string Cursor { get; }
///
/// User-role pairs for a group.
///
IEnumerable GroupUsers { get; }
}
///
internal class ApiGroupUserList : IApiGroupUserList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable GroupUsers => _groupUsers ?? new List(0);
[DataMember(Name="group_users"), Preserve]
public List _groupUsers { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "GroupUsers: [", string.Join(", ", GroupUsers), "], ");
return output;
}
}
///
/// Represents a complete leaderboard record with all scores and associated metadata.
///
public interface IApiLeaderboardRecord
{
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the leaderboard record was created.
///
string CreateTime { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the leaderboard record expires.
///
string ExpiryTime { get; }
///
/// The ID of the leaderboard this score belongs to.
///
string LeaderboardId { get; }
///
/// The maximum number of score updates allowed by the owner.
///
int MaxNumScore { get; }
///
/// Metadata.
///
string Metadata { get; }
///
/// The number of submissions to this score record.
///
int NumScore { get; }
///
/// The ID of the score owner, usually a user or group.
///
string OwnerId { get; }
///
/// The rank of this record.
///
string Rank { get; }
///
/// The score value.
///
string Score { get; }
///
/// An optional subscore value.
///
string Subscore { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the leaderboard record was updated.
///
string UpdateTime { get; }
///
/// The username of the score owner, if the owner is a user.
///
string Username { get; }
}
///
internal class ApiLeaderboardRecord : IApiLeaderboardRecord
{
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="expiry_time"), Preserve]
public string ExpiryTime { get; set; }
///
[DataMember(Name="leaderboard_id"), Preserve]
public string LeaderboardId { get; set; }
///
[DataMember(Name="max_num_score"), Preserve]
public int MaxNumScore { get; set; }
///
[DataMember(Name="metadata"), Preserve]
public string Metadata { get; set; }
///
[DataMember(Name="num_score"), Preserve]
public int NumScore { get; set; }
///
[DataMember(Name="owner_id"), Preserve]
public string OwnerId { get; set; }
///
[DataMember(Name="rank"), Preserve]
public string Rank { get; set; }
///
[DataMember(Name="score"), Preserve]
public string Score { get; set; }
///
[DataMember(Name="subscore"), Preserve]
public string Subscore { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[DataMember(Name="username"), Preserve]
public string Username { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "ExpiryTime: ", ExpiryTime, ", ");
output = string.Concat(output, "LeaderboardId: ", LeaderboardId, ", ");
output = string.Concat(output, "MaxNumScore: ", MaxNumScore, ", ");
output = string.Concat(output, "Metadata: ", Metadata, ", ");
output = string.Concat(output, "NumScore: ", NumScore, ", ");
output = string.Concat(output, "OwnerId: ", OwnerId, ", ");
output = string.Concat(output, "Rank: ", Rank, ", ");
output = string.Concat(output, "Score: ", Score, ", ");
output = string.Concat(output, "Subscore: ", Subscore, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "Username: ", Username, ", ");
return output;
}
}
///
/// A set of leaderboard records, may be part of a leaderboard records page or a batch of individual records.
///
public interface IApiLeaderboardRecordList
{
///
/// The cursor to send when retrieving the next page, if any.
///
string NextCursor { get; }
///
/// A batched set of leaderboard records belonging to specified owners.
///
IEnumerable OwnerRecords { get; }
///
/// The cursor to send when retrieving the previous page, if any.
///
string PrevCursor { get; }
///
/// The total number of ranks available.
///
string RankCount { get; }
///
/// A list of leaderboard records.
///
IEnumerable Records { get; }
}
///
internal class ApiLeaderboardRecordList : IApiLeaderboardRecordList
{
///
[DataMember(Name="next_cursor"), Preserve]
public string NextCursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable OwnerRecords => _ownerRecords ?? new List(0);
[DataMember(Name="owner_records"), Preserve]
public List _ownerRecords { get; set; }
///
[DataMember(Name="prev_cursor"), Preserve]
public string PrevCursor { get; set; }
///
[DataMember(Name="rank_count"), Preserve]
public string RankCount { get; set; }
///
[IgnoreDataMember]
public IEnumerable Records => _records ?? new List(0);
[DataMember(Name="records"), Preserve]
public List _records { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "NextCursor: ", NextCursor, ", ");
output = string.Concat(output, "OwnerRecords: [", string.Join(", ", OwnerRecords), "], ");
output = string.Concat(output, "PrevCursor: ", PrevCursor, ", ");
output = string.Concat(output, "RankCount: ", RankCount, ", ");
output = string.Concat(output, "Records: [", string.Join(", ", Records), "], ");
return output;
}
}
///
/// Link Steam to the current user's account.
///
public interface IApiLinkSteamRequest
{
///
/// The Facebook account details.
///
IApiAccountSteam Account { get; }
///
/// Import Steam friends for the user.
///
bool Sync { get; }
}
///
internal class ApiLinkSteamRequest : IApiLinkSteamRequest
{
///
[IgnoreDataMember]
public IApiAccountSteam Account => _account;
[DataMember(Name="account"), Preserve]
public ApiAccountSteam _account { get; set; }
///
[DataMember(Name="sync"), Preserve]
public bool Sync { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Account: ", Account, ", ");
output = string.Concat(output, "Sync: ", Sync, ", ");
return output;
}
}
///
/// List user subscriptions.
///
public interface IApiListSubscriptionsRequest
{
///
/// Cursor to retrieve a page of records from
///
string Cursor { get; }
///
/// Max number of results per page
///
int Limit { get; }
}
///
internal class ApiListSubscriptionsRequest : IApiListSubscriptionsRequest
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[DataMember(Name="limit"), Preserve]
public int Limit { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "Limit: ", Limit, ", ");
return output;
}
}
///
/// Represents a realtime match.
///
public interface IApiMatch
{
///
/// True if it's an server-managed authoritative match, false otherwise.
///
bool Authoritative { get; }
///
/// Handler name
///
string HandlerName { get; }
///
/// Match label, if any.
///
string Label { get; }
///
/// The ID of the match, can be used to join.
///
string MatchId { get; }
///
/// Current number of users in the match.
///
int Size { get; }
///
/// Tick Rate
///
int TickRate { get; }
}
///
internal class ApiMatch : IApiMatch
{
///
[DataMember(Name="authoritative"), Preserve]
public bool Authoritative { get; set; }
///
[DataMember(Name="handler_name"), Preserve]
public string HandlerName { get; set; }
///
[DataMember(Name="label"), Preserve]
public string Label { get; set; }
///
[DataMember(Name="match_id"), Preserve]
public string MatchId { get; set; }
///
[DataMember(Name="size"), Preserve]
public int Size { get; set; }
///
[DataMember(Name="tick_rate"), Preserve]
public int TickRate { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Authoritative: ", Authoritative, ", ");
output = string.Concat(output, "HandlerName: ", HandlerName, ", ");
output = string.Concat(output, "Label: ", Label, ", ");
output = string.Concat(output, "MatchId: ", MatchId, ", ");
output = string.Concat(output, "Size: ", Size, ", ");
output = string.Concat(output, "TickRate: ", TickRate, ", ");
return output;
}
}
///
/// A list of realtime matches.
///
public interface IApiMatchList
{
///
/// A number of matches corresponding to a list operation.
///
IEnumerable Matches { get; }
}
///
internal class ApiMatchList : IApiMatchList
{
///
[IgnoreDataMember]
public IEnumerable Matches => _matches ?? new List(0);
[DataMember(Name="matches"), Preserve]
public List _matches { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Matches: [", string.Join(", ", Matches), "], ");
return output;
}
}
///
/// Matchmaker ticket completion stats
///
public interface IApiMatchmakerCompletionStats
{
///
///
///
string CompleteTime { get; }
///
///
///
string CreateTime { get; }
}
///
internal class ApiMatchmakerCompletionStats : IApiMatchmakerCompletionStats
{
///
[DataMember(Name="complete_time"), Preserve]
public string CompleteTime { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "CompleteTime: ", CompleteTime, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
return output;
}
}
///
/// Matchmaker stats
///
public interface IApiMatchmakerStats
{
///
///
///
IEnumerable Completions { get; }
///
///
///
string OldestTicketCreateTime { get; }
///
///
///
int TicketCount { get; }
}
///
internal class ApiMatchmakerStats : IApiMatchmakerStats
{
///
[IgnoreDataMember]
public IEnumerable Completions => _completions ?? new List(0);
[DataMember(Name="completions"), Preserve]
public List _completions { get; set; }
///
[DataMember(Name="oldest_ticket_create_time"), Preserve]
public string OldestTicketCreateTime { get; set; }
///
[DataMember(Name="ticket_count"), Preserve]
public int TicketCount { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Completions: [", string.Join(", ", Completions), "], ");
output = string.Concat(output, "OldestTicketCreateTime: ", OldestTicketCreateTime, ", ");
output = string.Concat(output, "TicketCount: ", TicketCount, ", ");
return output;
}
}
///
/// A notification in the server.
///
public interface IApiNotification
{
///
/// Category code for this notification.
///
int Code { get; }
///
/// Content of the notification in JSON.
///
string Content { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the notification was created.
///
string CreateTime { get; }
///
/// ID of the Notification.
///
string Id { get; }
///
/// True if this notification was persisted to the database.
///
bool Persistent { get; }
///
/// ID of the sender, if a user. Otherwise 'null'.
///
string SenderId { get; }
///
/// Subject of the notification.
///
string Subject { get; }
}
///
internal class ApiNotification : IApiNotification
{
///
[DataMember(Name="code"), Preserve]
public int Code { get; set; }
///
[DataMember(Name="content"), Preserve]
public string Content { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="id"), Preserve]
public string Id { get; set; }
///
[DataMember(Name="persistent"), Preserve]
public bool Persistent { get; set; }
///
[DataMember(Name="sender_id"), Preserve]
public string SenderId { get; set; }
///
[DataMember(Name="subject"), Preserve]
public string Subject { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Code: ", Code, ", ");
output = string.Concat(output, "Content: ", Content, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "Id: ", Id, ", ");
output = string.Concat(output, "Persistent: ", Persistent, ", ");
output = string.Concat(output, "SenderId: ", SenderId, ", ");
output = string.Concat(output, "Subject: ", Subject, ", ");
return output;
}
}
///
/// A collection of zero or more notifications.
///
public interface IApiNotificationList
{
///
/// Use this cursor to paginate notifications. Cache this to catch up to new notifications.
///
string CacheableCursor { get; }
///
/// Collection of notifications.
///
IEnumerable Notifications { get; }
}
///
internal class ApiNotificationList : IApiNotificationList
{
///
[DataMember(Name="cacheable_cursor"), Preserve]
public string CacheableCursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable Notifications => _notifications ?? new List(0);
[DataMember(Name="notifications"), Preserve]
public List _notifications { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "CacheableCursor: ", CacheableCursor, ", ");
output = string.Concat(output, "Notifications: [", string.Join(", ", Notifications), "], ");
return output;
}
}
///
///
///
public enum ApiOperator
{
///
/// Operator that can be used to override the one set in the leaderboard.
///
NO_OVERRIDE = 0,
///
///
///
BEST = 1,
///
/// - NO_OVERRIDE: Do not override the leaderboard operator.
///
SET = 2,
///
/// - BEST: Override the leaderboard operator with BEST.
///
INCREMENT = 3,
///
/// - SET: Override the leaderboard operator with SET.
///
DECREMENT = 4,
}
///
/// Incoming information about a party.
///
public interface IApiParty
{
///
/// Hidden flag.
///
bool Hidden { get; }
///
/// The party label, if any.
///
string Label { get; }
///
/// Maximum number of party members.
///
int MaxSize { get; }
///
/// Open flag.
///
bool Open { get; }
///
/// Unique party identifier.
///
string PartyId { get; }
}
///
internal class ApiParty : IApiParty
{
///
[DataMember(Name="hidden"), Preserve]
public bool Hidden { get; set; }
///
[DataMember(Name="label"), Preserve]
public string Label { get; set; }
///
[DataMember(Name="max_size"), Preserve]
public int MaxSize { get; set; }
///
[DataMember(Name="open"), Preserve]
public bool Open { get; set; }
///
[DataMember(Name="party_id"), Preserve]
public string PartyId { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Hidden: ", Hidden, ", ");
output = string.Concat(output, "Label: ", Label, ", ");
output = string.Concat(output, "MaxSize: ", MaxSize, ", ");
output = string.Concat(output, "Open: ", Open, ", ");
output = string.Concat(output, "PartyId: ", PartyId, ", ");
return output;
}
}
///
/// A list of realtime matches.
///
public interface IApiPartyList
{
///
/// A cursor to send when retrieving the next page, if any.
///
string Cursor { get; }
///
/// A number of parties corresponding to a list operation.
///
IEnumerable Parties { get; }
}
///
internal class ApiPartyList : IApiPartyList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable Parties => _parties ?? new List(0);
[DataMember(Name="parties"), Preserve]
public List _parties { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "Parties: [", string.Join(", ", Parties), "], ");
return output;
}
}
///
/// Storage objects to get.
///
public interface IApiReadStorageObjectId
{
///
/// The collection which stores the object.
///
string Collection { get; }
///
/// The key of the object within the collection.
///
string Key { get; }
///
/// The user owner of the object.
///
string UserId { get; }
}
///
internal class ApiReadStorageObjectId : IApiReadStorageObjectId
{
///
[DataMember(Name="collection"), Preserve]
public string Collection { get; set; }
///
[DataMember(Name="key"), Preserve]
public string Key { get; set; }
///
[DataMember(Name="user_id"), Preserve]
public string UserId { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Collection: ", Collection, ", ");
output = string.Concat(output, "Key: ", Key, ", ");
output = string.Concat(output, "UserId: ", UserId, ", ");
return output;
}
}
///
/// Batch get storage objects.
///
public interface IApiReadStorageObjectsRequest
{
///
/// Batch of storage objects.
///
IEnumerable ObjectIds { get; }
}
///
internal class ApiReadStorageObjectsRequest : IApiReadStorageObjectsRequest
{
///
[IgnoreDataMember]
public IEnumerable ObjectIds => _objectIds ?? new List(0);
[DataMember(Name="object_ids"), Preserve]
public List _objectIds { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "ObjectIds: [", string.Join(", ", ObjectIds), "], ");
return output;
}
}
///
/// Execute an Lua function on the server.
///
public interface IApiRpc
{
///
/// The authentication key used when executed as a non-client HTTP request.
///
string HttpKey { get; }
///
/// The identifier of the function.
///
string Id { get; }
///
/// The payload of the function which must be a JSON object.
///
string Payload { get; }
}
///
internal class ApiRpc : IApiRpc
{
///
[DataMember(Name="http_key"), Preserve]
public string HttpKey { get; set; }
///
[DataMember(Name="id"), Preserve]
public string Id { get; set; }
///
[DataMember(Name="payload"), Preserve]
public string Payload { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "HttpKey: ", HttpKey, ", ");
output = string.Concat(output, "Id: ", Id, ", ");
output = string.Concat(output, "Payload: ", Payload, ", ");
return output;
}
}
///
/// A user's session used to authenticate messages.
///
public interface IApiSession
{
///
/// True if the corresponding account was just created, false otherwise.
///
bool Created { get; }
///
/// Refresh token that can be used for session token renewal.
///
string RefreshToken { get; }
///
/// Authentication credentials.
///
string Token { get; }
}
///
internal class ApiSession : IApiSession
{
///
[DataMember(Name="created"), Preserve]
public bool Created { get; set; }
///
[DataMember(Name="refresh_token"), Preserve]
public string RefreshToken { get; set; }
///
[DataMember(Name="token"), Preserve]
public string Token { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Created: ", Created, ", ");
output = string.Concat(output, "RefreshToken: ", RefreshToken, ", ");
output = string.Concat(output, "Token: ", Token, ", ");
return output;
}
}
///
/// Log out a session, invalidate a refresh token, or log out all sessions/refresh tokens for a user.
///
public interface IApiSessionLogoutRequest
{
///
/// Refresh token to invalidate.
///
string RefreshToken { get; }
///
/// Session token to log out.
///
string Token { get; }
}
///
internal class ApiSessionLogoutRequest : IApiSessionLogoutRequest
{
///
[DataMember(Name="refresh_token"), Preserve]
public string RefreshToken { get; set; }
///
[DataMember(Name="token"), Preserve]
public string Token { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "RefreshToken: ", RefreshToken, ", ");
output = string.Concat(output, "Token: ", Token, ", ");
return output;
}
}
///
/// Authenticate against the server with a refresh token.
///
public interface IApiSessionRefreshRequest
{
///
/// Refresh token.
///
string Token { get; }
///
/// Extra information that will be bundled in the session token.
///
IDictionary Vars { get; }
}
///
internal class ApiSessionRefreshRequest : IApiSessionRefreshRequest
{
///
[DataMember(Name="token"), Preserve]
public string Token { get; set; }
///
[IgnoreDataMember]
public IDictionary Vars => _vars ?? new Dictionary();
[DataMember(Name="vars"), Preserve]
public Dictionary _vars { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Token: ", Token, ", ");
var varsString = "";
foreach (var kvp in Vars)
{
varsString = string.Concat(varsString, "{" + kvp.Key + "=" + kvp.Value + "}");
}
output = string.Concat(output, "Vars: [" + varsString + "]");
return output;
}
}
///
/// An object within the storage engine.
///
public interface IApiStorageObject
{
///
/// The collection which stores the object.
///
string Collection { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created.
///
string CreateTime { get; }
///
/// The key of the object within the collection.
///
string Key { get; }
///
/// The read access permissions for the object.
///
int PermissionRead { get; }
///
/// The write access permissions for the object.
///
int PermissionWrite { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated.
///
string UpdateTime { get; }
///
/// The user owner of the object.
///
string UserId { get; }
///
/// The value of the object.
///
string Value { get; }
///
/// The version hash of the object.
///
string Version { get; }
}
///
internal class ApiStorageObject : IApiStorageObject
{
///
[DataMember(Name="collection"), Preserve]
public string Collection { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="key"), Preserve]
public string Key { get; set; }
///
[DataMember(Name="permission_read"), Preserve]
public int PermissionRead { get; set; }
///
[DataMember(Name="permission_write"), Preserve]
public int PermissionWrite { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[DataMember(Name="user_id"), Preserve]
public string UserId { get; set; }
///
[DataMember(Name="value"), Preserve]
public string Value { get; set; }
///
[DataMember(Name="version"), Preserve]
public string Version { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Collection: ", Collection, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "Key: ", Key, ", ");
output = string.Concat(output, "PermissionRead: ", PermissionRead, ", ");
output = string.Concat(output, "PermissionWrite: ", PermissionWrite, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "UserId: ", UserId, ", ");
output = string.Concat(output, "Value: ", Value, ", ");
output = string.Concat(output, "Version: ", Version, ", ");
return output;
}
}
///
/// A storage acknowledgement.
///
public interface IApiStorageObjectAck
{
///
/// The collection which stores the object.
///
string Collection { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created.
///
string CreateTime { get; }
///
/// The key of the object within the collection.
///
string Key { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated.
///
string UpdateTime { get; }
///
/// The owner of the object.
///
string UserId { get; }
///
/// The version hash of the object.
///
string Version { get; }
}
///
internal class ApiStorageObjectAck : IApiStorageObjectAck
{
///
[DataMember(Name="collection"), Preserve]
public string Collection { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="key"), Preserve]
public string Key { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[DataMember(Name="user_id"), Preserve]
public string UserId { get; set; }
///
[DataMember(Name="version"), Preserve]
public string Version { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Collection: ", Collection, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "Key: ", Key, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "UserId: ", UserId, ", ");
output = string.Concat(output, "Version: ", Version, ", ");
return output;
}
}
///
/// Batch of acknowledgements for the storage object write.
///
public interface IApiStorageObjectAcks
{
///
/// Batch of storage write acknowledgements.
///
IEnumerable Acks { get; }
}
///
internal class ApiStorageObjectAcks : IApiStorageObjectAcks
{
///
[IgnoreDataMember]
public IEnumerable Acks => _acks ?? new List(0);
[DataMember(Name="acks"), Preserve]
public List _acks { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Acks: [", string.Join(", ", Acks), "], ");
return output;
}
}
///
/// List of storage objects.
///
public interface IApiStorageObjectList
{
///
/// The cursor for the next page of results, if any.
///
string Cursor { get; }
///
/// The list of storage objects.
///
IEnumerable Objects { get; }
}
///
internal class ApiStorageObjectList : IApiStorageObjectList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable Objects => _objects ?? new List(0);
[DataMember(Name="objects"), Preserve]
public List _objects { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "Objects: [", string.Join(", ", Objects), "], ");
return output;
}
}
///
/// Batch of storage objects.
///
public interface IApiStorageObjects
{
///
/// The batch of storage objects.
///
IEnumerable Objects { get; }
}
///
internal class ApiStorageObjects : IApiStorageObjects
{
///
[IgnoreDataMember]
public IEnumerable Objects => _objects ?? new List(0);
[DataMember(Name="objects"), Preserve]
public List _objects { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Objects: [", string.Join(", ", Objects), "], ");
return output;
}
}
///
/// Environment where a purchase/subscription took place,
///
public enum ApiStoreEnvironment
{
///
/// - UNKNOWN: Unknown environment.
///
UNKNOWN = 0,
///
/// - SANDBOX: Sandbox/test environment.
///
SANDBOX = 1,
///
/// - PRODUCTION: Production environment.
///
PRODUCTION = 2,
}
///
/// Validation Provider,
///
public enum ApiStoreProvider
{
///
/// - APPLE_APP_STORE: Apple App Store
///
APPLE_APP_STORE = 0,
///
/// - GOOGLE_PLAY_STORE: Google Play Store
///
GOOGLE_PLAY_STORE = 1,
///
/// - HUAWEI_APP_GALLERY: Huawei App Gallery
///
HUAWEI_APP_GALLERY = 2,
///
/// - FACEBOOK_INSTANT_STORE: Facebook Instant Store
///
FACEBOOK_INSTANT_STORE = 3,
}
///
/// A list of validated subscriptions stored by Nakama.
///
public interface IApiSubscriptionList
{
///
/// The cursor to send when retrieving the next page, if any.
///
string Cursor { get; }
///
/// The cursor to send when retrieving the previous page, if any.
///
string PrevCursor { get; }
///
/// Stored validated subscriptions.
///
IEnumerable ValidatedSubscriptions { get; }
}
///
internal class ApiSubscriptionList : IApiSubscriptionList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[DataMember(Name="prev_cursor"), Preserve]
public string PrevCursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable ValidatedSubscriptions => _validatedSubscriptions ?? new List(0);
[DataMember(Name="validated_subscriptions"), Preserve]
public List _validatedSubscriptions { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "PrevCursor: ", PrevCursor, ", ");
output = string.Concat(output, "ValidatedSubscriptions: [", string.Join(", ", ValidatedSubscriptions), "], ");
return output;
}
}
///
/// A tournament on the server.
///
public interface IApiTournament
{
///
/// Whether the leaderboard was created authoritatively or not.
///
bool Authoritative { get; }
///
/// True if the tournament is active and can enter. A computed value.
///
bool CanEnter { get; }
///
/// The category of the tournament. e.g. "vip" could be category 1.
///
int Category { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the tournament was created.
///
string CreateTime { get; }
///
/// The description of the tournament. May be blank.
///
string Description { get; }
///
/// Duration of the tournament in seconds.
///
int Duration { get; }
///
/// The UNIX time when the tournament stops being active until next reset. A computed value.
///
int EndActive { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the tournament will be stopped.
///
string EndTime { get; }
///
/// The ID of the tournament.
///
string Id { get; }
///
/// Whether the user must join the tournament before being able to submit scores.
///
bool JoinRequired { get; }
///
/// The maximum score updates allowed per player for the current tournament.
///
int MaxNumScore { get; }
///
/// The maximum number of players for the tournament.
///
int MaxSize { get; }
///
/// Additional information stored as a JSON object.
///
string Metadata { get; }
///
/// The UNIX time when the tournament is next playable. A computed value.
///
int NextReset { get; }
///
/// Operator.
///
ApiOperator Operator { get; }
///
/// The UNIX time when the tournament was last reset. A computed value.
///
int PrevReset { get; }
///
/// The current number of players in the tournament.
///
int Size { get; }
///
/// ASC (0) or DESC (1) sort mode of scores in the tournament.
///
int SortOrder { get; }
///
/// The UNIX time when the tournament start being active. A computed value.
///
int StartActive { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the tournament will start.
///
string StartTime { get; }
///
/// The title for the tournament.
///
string Title { get; }
}
///
internal class ApiTournament : IApiTournament
{
///
[DataMember(Name="authoritative"), Preserve]
public bool Authoritative { get; set; }
///
[DataMember(Name="can_enter"), Preserve]
public bool CanEnter { get; set; }
///
[DataMember(Name="category"), Preserve]
public int Category { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="description"), Preserve]
public string Description { get; set; }
///
[DataMember(Name="duration"), Preserve]
public int Duration { get; set; }
///
[DataMember(Name="end_active"), Preserve]
public int EndActive { get; set; }
///
[DataMember(Name="end_time"), Preserve]
public string EndTime { get; set; }
///
[DataMember(Name="id"), Preserve]
public string Id { get; set; }
///
[DataMember(Name="join_required"), Preserve]
public bool JoinRequired { get; set; }
///
[DataMember(Name="max_num_score"), Preserve]
public int MaxNumScore { get; set; }
///
[DataMember(Name="max_size"), Preserve]
public int MaxSize { get; set; }
///
[DataMember(Name="metadata"), Preserve]
public string Metadata { get; set; }
///
[DataMember(Name="next_reset"), Preserve]
public int NextReset { get; set; }
///
[IgnoreDataMember]
public ApiOperator Operator => _operator;
[DataMember(Name="operator"), Preserve]
public ApiOperator _operator { get; set; }
///
[DataMember(Name="prev_reset"), Preserve]
public int PrevReset { get; set; }
///
[DataMember(Name="size"), Preserve]
public int Size { get; set; }
///
[DataMember(Name="sort_order"), Preserve]
public int SortOrder { get; set; }
///
[DataMember(Name="start_active"), Preserve]
public int StartActive { get; set; }
///
[DataMember(Name="start_time"), Preserve]
public string StartTime { get; set; }
///
[DataMember(Name="title"), Preserve]
public string Title { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Authoritative: ", Authoritative, ", ");
output = string.Concat(output, "CanEnter: ", CanEnter, ", ");
output = string.Concat(output, "Category: ", Category, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "Description: ", Description, ", ");
output = string.Concat(output, "Duration: ", Duration, ", ");
output = string.Concat(output, "EndActive: ", EndActive, ", ");
output = string.Concat(output, "EndTime: ", EndTime, ", ");
output = string.Concat(output, "Id: ", Id, ", ");
output = string.Concat(output, "JoinRequired: ", JoinRequired, ", ");
output = string.Concat(output, "MaxNumScore: ", MaxNumScore, ", ");
output = string.Concat(output, "MaxSize: ", MaxSize, ", ");
output = string.Concat(output, "Metadata: ", Metadata, ", ");
output = string.Concat(output, "NextReset: ", NextReset, ", ");
output = string.Concat(output, "Operator: ", Operator, ", ");
output = string.Concat(output, "PrevReset: ", PrevReset, ", ");
output = string.Concat(output, "Size: ", Size, ", ");
output = string.Concat(output, "SortOrder: ", SortOrder, ", ");
output = string.Concat(output, "StartActive: ", StartActive, ", ");
output = string.Concat(output, "StartTime: ", StartTime, ", ");
output = string.Concat(output, "Title: ", Title, ", ");
return output;
}
}
///
/// A list of tournaments.
///
public interface IApiTournamentList
{
///
/// A pagination cursor (optional).
///
string Cursor { get; }
///
/// The list of tournaments returned.
///
IEnumerable Tournaments { get; }
}
///
internal class ApiTournamentList : IApiTournamentList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable Tournaments => _tournaments ?? new List(0);
[DataMember(Name="tournaments"), Preserve]
public List _tournaments { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "Tournaments: [", string.Join(", ", Tournaments), "], ");
return output;
}
}
///
/// A set of tournament records which may be part of a tournament records page or a batch of individual records.
///
public interface IApiTournamentRecordList
{
///
/// The cursor to send when retireving the next page (optional).
///
string NextCursor { get; }
///
/// A batched set of tournament records belonging to specified owners.
///
IEnumerable OwnerRecords { get; }
///
/// The cursor to send when retrieving the previous page (optional).
///
string PrevCursor { get; }
///
/// The total number of ranks available.
///
string RankCount { get; }
///
/// A list of tournament records.
///
IEnumerable Records { get; }
}
///
internal class ApiTournamentRecordList : IApiTournamentRecordList
{
///
[DataMember(Name="next_cursor"), Preserve]
public string NextCursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable OwnerRecords => _ownerRecords ?? new List(0);
[DataMember(Name="owner_records"), Preserve]
public List _ownerRecords { get; set; }
///
[DataMember(Name="prev_cursor"), Preserve]
public string PrevCursor { get; set; }
///
[DataMember(Name="rank_count"), Preserve]
public string RankCount { get; set; }
///
[IgnoreDataMember]
public IEnumerable Records => _records ?? new List(0);
[DataMember(Name="records"), Preserve]
public List _records { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "NextCursor: ", NextCursor, ", ");
output = string.Concat(output, "OwnerRecords: [", string.Join(", ", OwnerRecords), "], ");
output = string.Concat(output, "PrevCursor: ", PrevCursor, ", ");
output = string.Concat(output, "RankCount: ", RankCount, ", ");
output = string.Concat(output, "Records: [", string.Join(", ", Records), "], ");
return output;
}
}
///
/// Update a user's account details.
///
public interface IApiUpdateAccountRequest
{
///
/// A URL for an avatar image.
///
string AvatarUrl { get; }
///
/// The display name of the user.
///
string DisplayName { get; }
///
/// The language expected to be a tag which follows the BCP-47 spec.
///
string LangTag { get; }
///
/// The location set by the user.
///
string Location { get; }
///
/// The timezone set by the user.
///
string Timezone { get; }
///
/// The username of the user's account.
///
string Username { get; }
}
///
internal class ApiUpdateAccountRequest : IApiUpdateAccountRequest
{
///
[DataMember(Name="avatar_url"), Preserve]
public string AvatarUrl { get; set; }
///
[DataMember(Name="display_name"), Preserve]
public string DisplayName { get; set; }
///
[DataMember(Name="lang_tag"), Preserve]
public string LangTag { get; set; }
///
[DataMember(Name="location"), Preserve]
public string Location { get; set; }
///
[DataMember(Name="timezone"), Preserve]
public string Timezone { get; set; }
///
[DataMember(Name="username"), Preserve]
public string Username { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "AvatarUrl: ", AvatarUrl, ", ");
output = string.Concat(output, "DisplayName: ", DisplayName, ", ");
output = string.Concat(output, "LangTag: ", LangTag, ", ");
output = string.Concat(output, "Location: ", Location, ", ");
output = string.Concat(output, "Timezone: ", Timezone, ", ");
output = string.Concat(output, "Username: ", Username, ", ");
return output;
}
}
///
/// A user in the server.
///
public interface IApiUser
{
///
/// The Apple Sign In ID in the user's account.
///
string AppleId { get; }
///
/// A URL for an avatar image.
///
string AvatarUrl { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user was created.
///
string CreateTime { get; }
///
/// The display name of the user.
///
string DisplayName { get; }
///
/// Number of related edges to this user.
///
int EdgeCount { get; }
///
/// The Facebook id in the user's account.
///
string FacebookId { get; }
///
/// The Facebook Instant Game ID in the user's account.
///
string FacebookInstantGameId { get; }
///
/// The Apple Game Center in of the user's account.
///
string GamecenterId { get; }
///
/// The Google id in the user's account.
///
string GoogleId { get; }
///
/// The id of the user's account.
///
string Id { get; }
///
/// The language expected to be a tag which follows the BCP-47 spec.
///
string LangTag { get; }
///
/// The location set by the user.
///
string Location { get; }
///
/// Additional information stored as a JSON object.
///
string Metadata { get; }
///
/// Indicates whether the user is currently online.
///
bool Online { get; }
///
/// The Steam id in the user's account.
///
string SteamId { get; }
///
/// The timezone set by the user.
///
string Timezone { get; }
///
/// The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user was last updated.
///
string UpdateTime { get; }
///
/// The username of the user's account.
///
string Username { get; }
}
///
internal class ApiUser : IApiUser
{
///
[DataMember(Name="apple_id"), Preserve]
public string AppleId { get; set; }
///
[DataMember(Name="avatar_url"), Preserve]
public string AvatarUrl { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[DataMember(Name="display_name"), Preserve]
public string DisplayName { get; set; }
///
[DataMember(Name="edge_count"), Preserve]
public int EdgeCount { get; set; }
///
[DataMember(Name="facebook_id"), Preserve]
public string FacebookId { get; set; }
///
[DataMember(Name="facebook_instant_game_id"), Preserve]
public string FacebookInstantGameId { get; set; }
///
[DataMember(Name="gamecenter_id"), Preserve]
public string GamecenterId { get; set; }
///
[DataMember(Name="google_id"), Preserve]
public string GoogleId { get; set; }
///
[DataMember(Name="id"), Preserve]
public string Id { get; set; }
///
[DataMember(Name="lang_tag"), Preserve]
public string LangTag { get; set; }
///
[DataMember(Name="location"), Preserve]
public string Location { get; set; }
///
[DataMember(Name="metadata"), Preserve]
public string Metadata { get; set; }
///
[DataMember(Name="online"), Preserve]
public bool Online { get; set; }
///
[DataMember(Name="steam_id"), Preserve]
public string SteamId { get; set; }
///
[DataMember(Name="timezone"), Preserve]
public string Timezone { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[DataMember(Name="username"), Preserve]
public string Username { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "AppleId: ", AppleId, ", ");
output = string.Concat(output, "AvatarUrl: ", AvatarUrl, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "DisplayName: ", DisplayName, ", ");
output = string.Concat(output, "EdgeCount: ", EdgeCount, ", ");
output = string.Concat(output, "FacebookId: ", FacebookId, ", ");
output = string.Concat(output, "FacebookInstantGameId: ", FacebookInstantGameId, ", ");
output = string.Concat(output, "GamecenterId: ", GamecenterId, ", ");
output = string.Concat(output, "GoogleId: ", GoogleId, ", ");
output = string.Concat(output, "Id: ", Id, ", ");
output = string.Concat(output, "LangTag: ", LangTag, ", ");
output = string.Concat(output, "Location: ", Location, ", ");
output = string.Concat(output, "Metadata: ", Metadata, ", ");
output = string.Concat(output, "Online: ", Online, ", ");
output = string.Concat(output, "SteamId: ", SteamId, ", ");
output = string.Concat(output, "Timezone: ", Timezone, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "Username: ", Username, ", ");
return output;
}
}
///
/// A list of groups belonging to a user, along with the user's role in each group.
///
public interface IApiUserGroupList
{
///
/// Cursor for the next page of results, if any.
///
string Cursor { get; }
///
/// Group-role pairs for a user.
///
IEnumerable UserGroups { get; }
}
///
internal class ApiUserGroupList : IApiUserGroupList
{
///
[DataMember(Name="cursor"), Preserve]
public string Cursor { get; set; }
///
[IgnoreDataMember]
public IEnumerable UserGroups => _userGroups ?? new List(0);
[DataMember(Name="user_groups"), Preserve]
public List _userGroups { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Cursor: ", Cursor, ", ");
output = string.Concat(output, "UserGroups: [", string.Join(", ", UserGroups), "], ");
return output;
}
}
///
/// A collection of zero or more users.
///
public interface IApiUsers
{
///
/// The User objects.
///
IEnumerable Users { get; }
}
///
internal class ApiUsers : IApiUsers
{
///
[IgnoreDataMember]
public IEnumerable Users => _users ?? new List(0);
[DataMember(Name="users"), Preserve]
public List _users { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Users: [", string.Join(", ", Users), "], ");
return output;
}
}
///
/// Apple IAP Purchases validation request
///
public interface IApiValidatePurchaseAppleRequest
{
///
/// Persist the purchase
///
bool Persist { get; }
///
/// Base64 encoded Apple receipt data payload.
///
string Receipt { get; }
}
///
internal class ApiValidatePurchaseAppleRequest : IApiValidatePurchaseAppleRequest
{
///
[DataMember(Name="persist"), Preserve]
public bool Persist { get; set; }
///
[DataMember(Name="receipt"), Preserve]
public string Receipt { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Persist: ", Persist, ", ");
output = string.Concat(output, "Receipt: ", Receipt, ", ");
return output;
}
}
///
/// Facebook Instant IAP Purchase validation request
///
public interface IApiValidatePurchaseFacebookInstantRequest
{
///
/// Persist the purchase
///
bool Persist { get; }
///
/// Base64 encoded Facebook Instant signedRequest receipt data payload.
///
string SignedRequest { get; }
}
///
internal class ApiValidatePurchaseFacebookInstantRequest : IApiValidatePurchaseFacebookInstantRequest
{
///
[DataMember(Name="persist"), Preserve]
public bool Persist { get; set; }
///
[DataMember(Name="signed_request"), Preserve]
public string SignedRequest { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Persist: ", Persist, ", ");
output = string.Concat(output, "SignedRequest: ", SignedRequest, ", ");
return output;
}
}
///
/// Google IAP Purchase validation request
///
public interface IApiValidatePurchaseGoogleRequest
{
///
/// Persist the purchase
///
bool Persist { get; }
///
/// JSON encoded Google purchase payload.
///
string Purchase { get; }
}
///
internal class ApiValidatePurchaseGoogleRequest : IApiValidatePurchaseGoogleRequest
{
///
[DataMember(Name="persist"), Preserve]
public bool Persist { get; set; }
///
[DataMember(Name="purchase"), Preserve]
public string Purchase { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Persist: ", Persist, ", ");
output = string.Concat(output, "Purchase: ", Purchase, ", ");
return output;
}
}
///
/// Huawei IAP Purchase validation request
///
public interface IApiValidatePurchaseHuaweiRequest
{
///
/// Persist the purchase
///
bool Persist { get; }
///
/// JSON encoded Huawei InAppPurchaseData.
///
string Purchase { get; }
///
/// InAppPurchaseData signature.
///
string Signature { get; }
}
///
internal class ApiValidatePurchaseHuaweiRequest : IApiValidatePurchaseHuaweiRequest
{
///
[DataMember(Name="persist"), Preserve]
public bool Persist { get; set; }
///
[DataMember(Name="purchase"), Preserve]
public string Purchase { get; set; }
///
[DataMember(Name="signature"), Preserve]
public string Signature { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Persist: ", Persist, ", ");
output = string.Concat(output, "Purchase: ", Purchase, ", ");
output = string.Concat(output, "Signature: ", Signature, ", ");
return output;
}
}
///
/// Validate IAP response.
///
public interface IApiValidatePurchaseResponse
{
///
/// Newly seen validated purchases.
///
IEnumerable ValidatedPurchases { get; }
}
///
internal class ApiValidatePurchaseResponse : IApiValidatePurchaseResponse
{
///
[IgnoreDataMember]
public IEnumerable ValidatedPurchases => _validatedPurchases ?? new List(0);
[DataMember(Name="validated_purchases"), Preserve]
public List _validatedPurchases { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "ValidatedPurchases: [", string.Join(", ", ValidatedPurchases), "], ");
return output;
}
}
///
/// Apple Subscription validation request
///
public interface IApiValidateSubscriptionAppleRequest
{
///
/// Persist the subscription.
///
bool Persist { get; }
///
/// Base64 encoded Apple receipt data payload.
///
string Receipt { get; }
}
///
internal class ApiValidateSubscriptionAppleRequest : IApiValidateSubscriptionAppleRequest
{
///
[DataMember(Name="persist"), Preserve]
public bool Persist { get; set; }
///
[DataMember(Name="receipt"), Preserve]
public string Receipt { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Persist: ", Persist, ", ");
output = string.Concat(output, "Receipt: ", Receipt, ", ");
return output;
}
}
///
/// Google Subscription validation request
///
public interface IApiValidateSubscriptionGoogleRequest
{
///
/// Persist the subscription.
///
bool Persist { get; }
///
/// JSON encoded Google purchase payload.
///
string Receipt { get; }
}
///
internal class ApiValidateSubscriptionGoogleRequest : IApiValidateSubscriptionGoogleRequest
{
///
[DataMember(Name="persist"), Preserve]
public bool Persist { get; set; }
///
[DataMember(Name="receipt"), Preserve]
public string Receipt { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Persist: ", Persist, ", ");
output = string.Concat(output, "Receipt: ", Receipt, ", ");
return output;
}
}
///
/// Validate Subscription response.
///
public interface IApiValidateSubscriptionResponse
{
///
///
///
IApiValidatedSubscription ValidatedSubscription { get; }
}
///
internal class ApiValidateSubscriptionResponse : IApiValidateSubscriptionResponse
{
///
[IgnoreDataMember]
public IApiValidatedSubscription ValidatedSubscription => _validatedSubscription;
[DataMember(Name="validated_subscription"), Preserve]
public ApiValidatedSubscription _validatedSubscription { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "ValidatedSubscription: ", ValidatedSubscription, ", ");
return output;
}
}
///
/// Validated Purchase stored by Nakama.
///
public interface IApiValidatedPurchase
{
///
/// Timestamp when the receipt validation was stored in DB.
///
string CreateTime { get; }
///
/// Whether the purchase was done in production or sandbox environment.
///
ApiStoreEnvironment Environment { get; }
///
/// Purchase Product ID.
///
string ProductId { get; }
///
/// Raw provider validation response.
///
string ProviderResponse { get; }
///
/// Timestamp when the purchase was done.
///
string PurchaseTime { get; }
///
/// Timestamp when the purchase was refunded. Set to UNIX
///
string RefundTime { get; }
///
/// Whether the purchase had already been validated by Nakama before.
///
bool SeenBefore { get; }
///
/// Store identifier
///
ApiStoreProvider Store { get; }
///
/// Purchase Transaction ID.
///
string TransactionId { get; }
///
/// Timestamp when the receipt validation was updated in DB.
///
string UpdateTime { get; }
///
/// Purchase User ID.
///
string UserId { get; }
}
///
internal class ApiValidatedPurchase : IApiValidatedPurchase
{
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[IgnoreDataMember]
public ApiStoreEnvironment Environment => _environment;
[DataMember(Name="environment"), Preserve]
public ApiStoreEnvironment _environment { get; set; }
///
[DataMember(Name="product_id"), Preserve]
public string ProductId { get; set; }
///
[DataMember(Name="provider_response"), Preserve]
public string ProviderResponse { get; set; }
///
[DataMember(Name="purchase_time"), Preserve]
public string PurchaseTime { get; set; }
///
[DataMember(Name="refund_time"), Preserve]
public string RefundTime { get; set; }
///
[DataMember(Name="seen_before"), Preserve]
public bool SeenBefore { get; set; }
///
[IgnoreDataMember]
public ApiStoreProvider Store => _store;
[DataMember(Name="store"), Preserve]
public ApiStoreProvider _store { get; set; }
///
[DataMember(Name="transaction_id"), Preserve]
public string TransactionId { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[DataMember(Name="user_id"), Preserve]
public string UserId { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "Environment: ", Environment, ", ");
output = string.Concat(output, "ProductId: ", ProductId, ", ");
output = string.Concat(output, "ProviderResponse: ", ProviderResponse, ", ");
output = string.Concat(output, "PurchaseTime: ", PurchaseTime, ", ");
output = string.Concat(output, "RefundTime: ", RefundTime, ", ");
output = string.Concat(output, "SeenBefore: ", SeenBefore, ", ");
output = string.Concat(output, "Store: ", Store, ", ");
output = string.Concat(output, "TransactionId: ", TransactionId, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "UserId: ", UserId, ", ");
return output;
}
}
///
///
///
public interface IApiValidatedSubscription
{
///
/// Whether the subscription is currently active or not.
///
bool Active { get; }
///
/// UNIX Timestamp when the receipt validation was stored in DB.
///
string CreateTime { get; }
///
/// Whether the purchase was done in production or sandbox environment.
///
ApiStoreEnvironment Environment { get; }
///
/// Subscription expiration time. The subscription can still be auto-renewed to extend the expiration time further.
///
string ExpiryTime { get; }
///
/// Purchase Original transaction ID (we only keep track of the original subscription, not subsequent renewals).
///
string OriginalTransactionId { get; }
///
/// Purchase Product ID.
///
string ProductId { get; }
///
/// Raw provider notification body.
///
string ProviderNotification { get; }
///
/// Raw provider validation response body.
///
string ProviderResponse { get; }
///
/// UNIX Timestamp when the purchase was done.
///
string PurchaseTime { get; }
///
/// Subscription refund time. If this time is set, the subscription was refunded.
///
string RefundTime { get; }
///
/// Store identifier
///
ApiStoreProvider Store { get; }
///
/// UNIX Timestamp when the receipt validation was updated in DB.
///
string UpdateTime { get; }
///
/// Subscription User ID.
///
string UserId { get; }
}
///
internal class ApiValidatedSubscription : IApiValidatedSubscription
{
///
[DataMember(Name="active"), Preserve]
public bool Active { get; set; }
///
[DataMember(Name="create_time"), Preserve]
public string CreateTime { get; set; }
///
[IgnoreDataMember]
public ApiStoreEnvironment Environment => _environment;
[DataMember(Name="environment"), Preserve]
public ApiStoreEnvironment _environment { get; set; }
///
[DataMember(Name="expiry_time"), Preserve]
public string ExpiryTime { get; set; }
///
[DataMember(Name="original_transaction_id"), Preserve]
public string OriginalTransactionId { get; set; }
///
[DataMember(Name="product_id"), Preserve]
public string ProductId { get; set; }
///
[DataMember(Name="provider_notification"), Preserve]
public string ProviderNotification { get; set; }
///
[DataMember(Name="provider_response"), Preserve]
public string ProviderResponse { get; set; }
///
[DataMember(Name="purchase_time"), Preserve]
public string PurchaseTime { get; set; }
///
[DataMember(Name="refund_time"), Preserve]
public string RefundTime { get; set; }
///
[IgnoreDataMember]
public ApiStoreProvider Store => _store;
[DataMember(Name="store"), Preserve]
public ApiStoreProvider _store { get; set; }
///
[DataMember(Name="update_time"), Preserve]
public string UpdateTime { get; set; }
///
[DataMember(Name="user_id"), Preserve]
public string UserId { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Active: ", Active, ", ");
output = string.Concat(output, "CreateTime: ", CreateTime, ", ");
output = string.Concat(output, "Environment: ", Environment, ", ");
output = string.Concat(output, "ExpiryTime: ", ExpiryTime, ", ");
output = string.Concat(output, "OriginalTransactionId: ", OriginalTransactionId, ", ");
output = string.Concat(output, "ProductId: ", ProductId, ", ");
output = string.Concat(output, "ProviderNotification: ", ProviderNotification, ", ");
output = string.Concat(output, "ProviderResponse: ", ProviderResponse, ", ");
output = string.Concat(output, "PurchaseTime: ", PurchaseTime, ", ");
output = string.Concat(output, "RefundTime: ", RefundTime, ", ");
output = string.Concat(output, "Store: ", Store, ", ");
output = string.Concat(output, "UpdateTime: ", UpdateTime, ", ");
output = string.Concat(output, "UserId: ", UserId, ", ");
return output;
}
}
///
/// The object to store.
///
public interface IApiWriteStorageObject
{
///
/// The collection to store the object.
///
string Collection { get; }
///
/// The key for the object within the collection.
///
string Key { get; }
///
/// The read access permissions for the object.
///
int PermissionRead { get; }
///
/// The write access permissions for the object.
///
int PermissionWrite { get; }
///
/// The value of the object.
///
string Value { get; }
///
/// The version hash of the object to check. Possible values are: ["", "*", "#hash#"]. if-match and if-none-match
///
string Version { get; }
}
///
internal class ApiWriteStorageObject : IApiWriteStorageObject
{
///
[DataMember(Name="collection"), Preserve]
public string Collection { get; set; }
///
[DataMember(Name="key"), Preserve]
public string Key { get; set; }
///
[DataMember(Name="permission_read"), Preserve]
public int PermissionRead { get; set; }
///
[DataMember(Name="permission_write"), Preserve]
public int PermissionWrite { get; set; }
///
[DataMember(Name="value"), Preserve]
public string Value { get; set; }
///
[DataMember(Name="version"), Preserve]
public string Version { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Collection: ", Collection, ", ");
output = string.Concat(output, "Key: ", Key, ", ");
output = string.Concat(output, "PermissionRead: ", PermissionRead, ", ");
output = string.Concat(output, "PermissionWrite: ", PermissionWrite, ", ");
output = string.Concat(output, "Value: ", Value, ", ");
output = string.Concat(output, "Version: ", Version, ", ");
return output;
}
}
///
/// Write objects to the storage engine.
///
public interface IApiWriteStorageObjectsRequest
{
///
/// The objects to store on the server.
///
IEnumerable Objects { get; }
}
///
internal class ApiWriteStorageObjectsRequest : IApiWriteStorageObjectsRequest
{
///
[IgnoreDataMember]
public IEnumerable Objects => _objects ?? new List(0);
[DataMember(Name="objects"), Preserve]
public List _objects { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Objects: [", string.Join(", ", Objects), "], ");
return output;
}
}
///
///
///
public interface IProtobufAny
{
///
///
///
string @type { get; }
}
///
internal class ProtobufAny : IProtobufAny
{
///
[DataMember(Name="@type"), Preserve]
public string @type { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "@type: ", @type, ", ");
return output;
}
}
///
///
///
public interface IRpcStatus
{
///
///
///
int Code { get; }
///
///
///
IEnumerable Details { get; }
///
///
///
string Message { get; }
}
///
internal class RpcStatus : IRpcStatus
{
///
[DataMember(Name="code"), Preserve]
public int Code { get; set; }
///
[IgnoreDataMember]
public IEnumerable Details => _details ?? new List(0);
[DataMember(Name="details"), Preserve]
public List _details { get; set; }
///
[DataMember(Name="message"), Preserve]
public string Message { get; set; }
public override string ToString()
{
var output = "";
output = string.Concat(output, "Code: ", Code, ", ");
output = string.Concat(output, "Details: [", string.Join(", ", Details), "], ");
output = string.Concat(output, "Message: ", Message, ", ");
return output;
}
}
///
/// The low level client for the Nakama API.
///
internal class ApiClient
{
public readonly IHttpAdapter HttpAdapter;
public int Timeout { get; set; }
private readonly Uri _baseUri;
public ApiClient(Uri baseUri, IHttpAdapter httpAdapter, int timeout = 10)
{
_baseUri = baseUri;
HttpAdapter = httpAdapter;
Timeout = timeout;
}
///
/// A healthcheck which load balancers can use to check the service.
///
public async Task HealthcheckAsync(
string bearerToken,
CancellationToken? cancellationToken)
{
var urlpath = "/healthcheck";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "GET";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Delete the current user's account.
///
public async Task DeleteAccountAsync(
string bearerToken,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/account";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "DELETE";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Fetch the current user's account.
///
public async Task GetAccountAsync(
string bearerToken,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/account";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "GET";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Update fields in the current user's account.
///
public async Task UpdateAccountAsync(
string bearerToken,
ApiUpdateAccountRequest body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "PUT";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Authenticate a user with an Apple ID against the server.
///
public async Task AuthenticateAppleAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountApple account,
bool? create,
string username,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/apple";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with a custom id against the server.
///
public async Task AuthenticateCustomAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountCustom account,
bool? create,
string username,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/custom";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with a device id against the server.
///
public async Task AuthenticateDeviceAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountDevice account,
bool? create,
string username,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/device";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with an email+password against the server.
///
public async Task AuthenticateEmailAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountEmail account,
bool? create,
string username,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/email";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with a Facebook OAuth token against the server.
///
public async Task AuthenticateFacebookAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountFacebook account,
bool? create,
string username,
bool? sync,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/facebook";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
if (sync != null) {
queryParams = string.Concat(queryParams, "sync=", sync.ToString().ToLower(), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with a Facebook Instant Game token against the server.
///
public async Task AuthenticateFacebookInstantGameAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountFacebookInstantGame account,
bool? create,
string username,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/facebookinstantgame";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with Apple's GameCenter against the server.
///
public async Task AuthenticateGameCenterAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountGameCenter account,
bool? create,
string username,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/gamecenter";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with Google against the server.
///
public async Task AuthenticateGoogleAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountGoogle account,
bool? create,
string username,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/google";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Authenticate a user with Steam against the server.
///
public async Task AuthenticateSteamAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiAccountSteam account,
bool? create,
string username,
bool? sync,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/authenticate/steam";
var queryParams = "";
if (create != null) {
queryParams = string.Concat(queryParams, "create=", create.ToString().ToLower(), "&");
}
if (username != null) {
queryParams = string.Concat(queryParams, "username=", Uri.EscapeDataString(username), "&");
}
if (sync != null) {
queryParams = string.Concat(queryParams, "sync=", sync.ToString().ToLower(), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Add an Apple ID to the social profiles on the current user's account.
///
public async Task LinkAppleAsync(
string bearerToken,
ApiAccountApple body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/apple";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add a custom ID to the social profiles on the current user's account.
///
public async Task LinkCustomAsync(
string bearerToken,
ApiAccountCustom body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/custom";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add a device ID to the social profiles on the current user's account.
///
public async Task LinkDeviceAsync(
string bearerToken,
ApiAccountDevice body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/device";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add an email+password to the social profiles on the current user's account.
///
public async Task LinkEmailAsync(
string bearerToken,
ApiAccountEmail body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/email";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add Facebook to the social profiles on the current user's account.
///
public async Task LinkFacebookAsync(
string bearerToken,
ApiAccountFacebook account,
bool? sync,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/account/link/facebook";
var queryParams = "";
if (sync != null) {
queryParams = string.Concat(queryParams, "sync=", sync.ToString().ToLower(), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add Facebook Instant Game to the social profiles on the current user's account.
///
public async Task LinkFacebookInstantGameAsync(
string bearerToken,
ApiAccountFacebookInstantGame body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/facebookinstantgame";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add Apple's GameCenter to the social profiles on the current user's account.
///
public async Task LinkGameCenterAsync(
string bearerToken,
ApiAccountGameCenter body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/gamecenter";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add Google to the social profiles on the current user's account.
///
public async Task LinkGoogleAsync(
string bearerToken,
ApiAccountGoogle body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/google";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add Steam to the social profiles on the current user's account.
///
public async Task LinkSteamAsync(
string bearerToken,
ApiLinkSteamRequest body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/link/steam";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Refresh a user's session using a refresh token retrieved from a previous authentication request.
///
public async Task SessionRefreshAsync(
string basicAuthUsername,
string basicAuthPassword,
ApiSessionRefreshRequest body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/session/refresh";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
if (!string.IsNullOrEmpty(basicAuthUsername))
{
var credentials = Encoding.UTF8.GetBytes(basicAuthUsername + ":" + basicAuthPassword);
var header = string.Concat("Basic ", Convert.ToBase64String(credentials));
headers.Add("Authorization", header);
}
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Remove the Apple ID from the social profiles on the current user's account.
///
public async Task UnlinkAppleAsync(
string bearerToken,
ApiAccountApple body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/apple";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove the custom ID from the social profiles on the current user's account.
///
public async Task UnlinkCustomAsync(
string bearerToken,
ApiAccountCustom body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/custom";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove the device ID from the social profiles on the current user's account.
///
public async Task UnlinkDeviceAsync(
string bearerToken,
ApiAccountDevice body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/device";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove the email+password from the social profiles on the current user's account.
///
public async Task UnlinkEmailAsync(
string bearerToken,
ApiAccountEmail body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/email";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove Facebook from the social profiles on the current user's account.
///
public async Task UnlinkFacebookAsync(
string bearerToken,
ApiAccountFacebook body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/facebook";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove Facebook Instant Game profile from the social profiles on the current user's account.
///
public async Task UnlinkFacebookInstantGameAsync(
string bearerToken,
ApiAccountFacebookInstantGame body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/facebookinstantgame";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove Apple's GameCenter from the social profiles on the current user's account.
///
public async Task UnlinkGameCenterAsync(
string bearerToken,
ApiAccountGameCenter body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/gamecenter";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove Google from the social profiles on the current user's account.
///
public async Task UnlinkGoogleAsync(
string bearerToken,
ApiAccountGoogle body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/google";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Remove Steam from the social profiles on the current user's account.
///
public async Task UnlinkSteamAsync(
string bearerToken,
ApiAccountSteam body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/account/unlink/steam";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// List a channel's message history.
///
public async Task ListChannelMessagesAsync(
string bearerToken,
string channelId,
int? limit,
bool? forward,
string cursor,
CancellationToken? cancellationToken)
{
if (channelId == null)
{
throw new ArgumentException("'channelId' is required but was null.");
}
var urlpath = "/v2/channel/{channelId}";
urlpath = urlpath.Replace("{channelId}", Uri.EscapeDataString(channelId));
var queryParams = "";
if (limit != null) {
queryParams = string.Concat(queryParams, "limit=", limit, "&");
}
if (forward != null) {
queryParams = string.Concat(queryParams, "forward=", forward.ToString().ToLower(), "&");
}
if (cursor != null) {
queryParams = string.Concat(queryParams, "cursor=", Uri.EscapeDataString(cursor), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "GET";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Submit an event for processing in the server's registered runtime custom events handler.
///
public async Task EventAsync(
string bearerToken,
ApiEvent body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/event";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Delete one or more users by ID or username.
///
public async Task DeleteFriendsAsync(
string bearerToken,
IEnumerable ids,
IEnumerable usernames,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/friend";
var queryParams = "";
foreach (var elem in ids ?? new string[0])
{
queryParams = string.Concat(queryParams, "ids=", Uri.EscapeDataString(elem), "&");
}
foreach (var elem in usernames ?? new string[0])
{
queryParams = string.Concat(queryParams, "usernames=", Uri.EscapeDataString(elem), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "DELETE";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// List all friends for the current user.
///
public async Task ListFriendsAsync(
string bearerToken,
int? limit,
int? state,
string cursor,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/friend";
var queryParams = "";
if (limit != null) {
queryParams = string.Concat(queryParams, "limit=", limit, "&");
}
if (state != null) {
queryParams = string.Concat(queryParams, "state=", state, "&");
}
if (cursor != null) {
queryParams = string.Concat(queryParams, "cursor=", Uri.EscapeDataString(cursor), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "GET";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Add friends by ID or username to a user's account.
///
public async Task AddFriendsAsync(
string bearerToken,
IEnumerable ids,
IEnumerable usernames,
string metadata,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/friend";
var queryParams = "";
foreach (var elem in ids ?? new string[0])
{
queryParams = string.Concat(queryParams, "ids=", Uri.EscapeDataString(elem), "&");
}
foreach (var elem in usernames ?? new string[0])
{
queryParams = string.Concat(queryParams, "usernames=", Uri.EscapeDataString(elem), "&");
}
if (metadata != null) {
queryParams = string.Concat(queryParams, "metadata=", Uri.EscapeDataString(metadata), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Block one or more users by ID or username.
///
public async Task BlockFriendsAsync(
string bearerToken,
IEnumerable ids,
IEnumerable usernames,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/friend/block";
var queryParams = "";
foreach (var elem in ids ?? new string[0])
{
queryParams = string.Concat(queryParams, "ids=", Uri.EscapeDataString(elem), "&");
}
foreach (var elem in usernames ?? new string[0])
{
queryParams = string.Concat(queryParams, "usernames=", Uri.EscapeDataString(elem), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Import Facebook friends and add them to a user's account.
///
public async Task ImportFacebookFriendsAsync(
string bearerToken,
ApiAccountFacebook account,
bool? reset,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/friend/facebook";
var queryParams = "";
if (reset != null) {
queryParams = string.Concat(queryParams, "reset=", reset.ToString().ToLower(), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// List friends of friends for the current user.
///
public async Task ListFriendsOfFriendsAsync(
string bearerToken,
int? limit,
string cursor,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/friend/friends";
var queryParams = "";
if (limit != null) {
queryParams = string.Concat(queryParams, "limit=", limit, "&");
}
if (cursor != null) {
queryParams = string.Concat(queryParams, "cursor=", Uri.EscapeDataString(cursor), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "GET";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Import Steam friends and add them to a user's account.
///
public async Task ImportSteamFriendsAsync(
string bearerToken,
ApiAccountSteam account,
bool? reset,
CancellationToken? cancellationToken)
{
if (account == null)
{
throw new ArgumentException("'account' is required but was null.");
}
var urlpath = "/v2/friend/steam";
var queryParams = "";
if (reset != null) {
queryParams = string.Concat(queryParams, "reset=", reset.ToString().ToLower(), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = account.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// List groups based on given filters.
///
public async Task ListGroupsAsync(
string bearerToken,
string name,
string cursor,
int? limit,
string langTag,
int? members,
bool? open,
CancellationToken? cancellationToken)
{
var urlpath = "/v2/group";
var queryParams = "";
if (name != null) {
queryParams = string.Concat(queryParams, "name=", Uri.EscapeDataString(name), "&");
}
if (cursor != null) {
queryParams = string.Concat(queryParams, "cursor=", Uri.EscapeDataString(cursor), "&");
}
if (limit != null) {
queryParams = string.Concat(queryParams, "limit=", limit, "&");
}
if (langTag != null) {
queryParams = string.Concat(queryParams, "lang_tag=", Uri.EscapeDataString(langTag), "&");
}
if (members != null) {
queryParams = string.Concat(queryParams, "members=", members, "&");
}
if (open != null) {
queryParams = string.Concat(queryParams, "open=", open.ToString().ToLower(), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "GET";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Create a new group with the current user as the owner.
///
public async Task CreateGroupAsync(
string bearerToken,
ApiCreateGroupRequest body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/group";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Delete a group by ID.
///
public async Task DeleteGroupAsync(
string bearerToken,
string groupId,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "DELETE";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Update fields in a given group.
///
public async Task UpdateGroupAsync(
string bearerToken,
string groupId,
ApiUpdateGroupRequest body,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/group/{groupId}";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "PUT";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Add users to a group.
///
public async Task AddGroupUsersAsync(
string bearerToken,
string groupId,
IEnumerable userIds,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/add";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
foreach (var elem in userIds ?? new string[0])
{
queryParams = string.Concat(queryParams, "user_ids=", Uri.EscapeDataString(elem), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Ban a set of users from a group.
///
public async Task BanGroupUsersAsync(
string bearerToken,
string groupId,
IEnumerable userIds,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/ban";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
foreach (var elem in userIds ?? new string[0])
{
queryParams = string.Concat(queryParams, "user_ids=", Uri.EscapeDataString(elem), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Demote a set of users in a group to the next role down.
///
public async Task DemoteGroupUsersAsync(
string bearerToken,
string groupId,
IEnumerable userIds,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/demote";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
foreach (var elem in userIds ?? new string[0])
{
queryParams = string.Concat(queryParams, "user_ids=", Uri.EscapeDataString(elem), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Immediately join an open group, or request to join a closed one.
///
public async Task JoinGroupAsync(
string bearerToken,
string groupId,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/join";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Kick a set of users from a group.
///
public async Task KickGroupUsersAsync(
string bearerToken,
string groupId,
IEnumerable userIds,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/kick";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
foreach (var elem in userIds ?? new string[0])
{
queryParams = string.Concat(queryParams, "user_ids=", Uri.EscapeDataString(elem), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Leave a group the user is a member of.
///
public async Task LeaveGroupAsync(
string bearerToken,
string groupId,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/leave";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// Promote a set of users in a group to the next role up.
///
public async Task PromoteGroupUsersAsync(
string bearerToken,
string groupId,
IEnumerable userIds,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/promote";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
foreach (var elem in userIds ?? new string[0])
{
queryParams = string.Concat(queryParams, "user_ids=", Uri.EscapeDataString(elem), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
}
///
/// List all users that are part of a group.
///
public async Task ListGroupUsersAsync(
string bearerToken,
string groupId,
int? limit,
int? state,
string cursor,
CancellationToken? cancellationToken)
{
if (groupId == null)
{
throw new ArgumentException("'groupId' is required but was null.");
}
var urlpath = "/v2/group/{groupId}/user";
urlpath = urlpath.Replace("{groupId}", Uri.EscapeDataString(groupId));
var queryParams = "";
if (limit != null) {
queryParams = string.Concat(queryParams, "limit=", limit, "&");
}
if (state != null) {
queryParams = string.Concat(queryParams, "state=", state, "&");
}
if (cursor != null) {
queryParams = string.Concat(queryParams, "cursor=", Uri.EscapeDataString(cursor), "&");
}
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "GET";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Validate Apple IAP Receipt
///
public async Task ValidatePurchaseAppleAsync(
string bearerToken,
ApiValidatePurchaseAppleRequest body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/iap/purchase/apple";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Validate FB Instant IAP Receipt
///
public async Task ValidatePurchaseFacebookInstantAsync(
string bearerToken,
ApiValidatePurchaseFacebookInstantRequest body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/iap/purchase/facebookinstant";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson();
}
///
/// Validate Google IAP Receipt
///
public async Task ValidatePurchaseGoogleAsync(
string bearerToken,
ApiValidatePurchaseGoogleRequest body,
CancellationToken? cancellationToken)
{
if (body == null)
{
throw new ArgumentException("'body' is required but was null.");
}
var urlpath = "/v2/iap/purchase/google";
var queryParams = "";
string path = _baseUri.AbsolutePath.TrimEnd('/') + urlpath;
var uri = new UriBuilder(_baseUri)
{
Path = path,
Query = queryParams
}.Uri;
var method = "POST";
var headers = new Dictionary();
var header = string.Concat("Bearer ", bearerToken);
headers.Add("Authorization", header);
byte[] content = null;
var jsonBody = body.ToJson();
content = Encoding.UTF8.GetBytes(jsonBody);
var contents = await HttpAdapter.SendAsync(method, uri, headers, content, Timeout, cancellationToken);
return contents.FromJson