# SendingNetwork DotNet SDK A DotNet SDK for SendingNetwork. ## Supported Platforms * [.NET Standard 2.0](https://docs.microsoft.com/en-us/dotnet/standard/net-standard) or greater ## Installation Add dependency ```shell dotnet add package SDN.Sdk ``` ## Use the SDK in your app ### 1. Create Use `SDNClientFactory` to create an instance of `SDNClient` ```csharp var factory = new SDNClientFactory(); ISDNClient client = factory.Create(); ``` ### 2.Login Currently, SDNClient supports only wallet account login ```csharp // pre login var preLoginResponse = await client.PreLoginAsync(new Uri(nodeUrl), walletAddress); // sign message (or prompt user to sign with a wallet app) var signer = new EthereumMessageSigner(); var signature = signer.EncodeUTF8AndSign(preLoginResponse.Message, new EthECKey(privateKey)); // login did var loginResponse = await client.LoginAsync(preLoginResponse.Did, preLoginResponse.RandomServer, preLoginResponse.Updated, preLoginResponse.Message, signature); userId = loginResponse.UserId; accessToken = loginResponse.AccessToken; // set client credential client.SetCredential(new Uri(nodeUrl), loginResponse.UserId, loginResponse.AccessToken); ``` ### 3. Start listening for incomming events To listen for the incoming room events you need to subscribe to `OnSDNRoomEventsReceived;` ```csharp // add event listener client.OnSDNRoomEventsReceived += (sender, eventArgs) => { foreach (var roomEvent in eventArgs.SDNRoomEvents) { if (roomEvent is TextMessageEvent textMessageEvent) { Console.WriteLine($"RoomId: {textMessageEvent.RoomId} received event from {textMessageEvent.SenderUserId}: {textMessageEvent.Message}."); } } }; // start syncing client.Start(); ``` ### 4. Call API functions ```csharp // create new room await client.CreateRoomAsync(roomName, null); // invite user to the room await client.InviteUserAsync(roomId, userId); // send room message await client.SendMessageAsync(roomId, "hello"); ``` ## Examples For a complete example, refer to `Sample.cs`.You can also clone this repository and run `SDN.Sdk.Sample.Console`. ## Client API Doc ### DID PreLogin ```csharp Task<PreLoginResponse> PreLoginAsync(Uri nodeUri, string walletAddress) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | nodeUri | string | uri of node server | true | | walletAddress | string | user wallet address | true | output params: | Name | Type | Description | Required | | :------- | :---------- | :---------- | :------- | | PreLoginResponse.Did | string | user did | true | | PreLoginResponse.Message | string | message to be signed | true | | PreLoginResponse.RandomServer | string | random nonce | true | | PreLoginResponse.Updated | string | update time of did document | true | ### DID Login ```csharp Task<LoginResponse> LoginAsync(string did, string nonce, string updateTime, string message, string signature) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | did | string | user did | true | | nonce | string | random nonce | true | | updateTime | string | update time of did document | true | | message | string | message to be signed | true | | signature | string | signature of the message | true | output params: | Name | Type | Description | Required | | :------- | :---------- | :---------- | :------- | | LoginResponse.UserId | string | user did | true | | LoginResponse.AccessToken | string | access token | true | | LoginResponse.DeviceId | string | device id | true | ### Create Room ```csharp Task<CreateRoomResponse> CreateRoomAsync(string name, string[]? invitedUserIds) ``` input params:RoomCreateOptions | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | name | string | room name | true | | invitedUserIds | string array | array of user ids to invite | false | output params: | Name | Type | Description | Required | | :------- | :---------- | :---------- | :------- | | CreateRoomResponse.RoomId | string | id of the new room | true | ### Invite User ```csharp Task InviteUserAsync(string roomId, string userId) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | roomId | string | room id | true | | userId | string | user id | true | output params: none ### Kick User ```csharp Task KickUserAsync(string roomId, string userId) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | roomId | string | room id | true | | userId | string | user id | true | return values: none ### Join Room ```csharp Task<JoinRoomResponse> JoinRoomAsync(string roomId) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | roomId | string | room id | true | output params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | JoinRoomResponse.RoomId | string | room id | true | ### Leave Room ```csharp Task LeaveRoomAsync(string roomId) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | roomId | string | room id | true | output params: none ### Get Room Memebers ```csharp Task<RoomMembersResponse> GetRoomMembersAsync(string roomId) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | roomId | string | room id | true | output params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | RoomMembersResponse.joined | array of MemberInfo | room members | true | MemberInfo: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | MemberInfo.DisplayName | string | member display name | true | | MemberInfo.AvatarUrl | string | member avatar url | true | ### Send Message ```csharp Task<string> SendMessageAsync(string roomId, string message) ``` input params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | roomId | string | room id | true | | message | string | message to send | true | output params: | Name | Type | Description | Required | | :------ | :----- | :---------- | :------- | | eventId | string | event id | true |