|
7 | 7 | using Dracoon.Crypto.Sdk.Model; |
8 | 8 | using static Dracoon.Sdk.SdkInternal.DracoonRequestExecuter; |
9 | 9 | using Dracoon.Sdk.Error; |
| 10 | +using System.Drawing; |
| 11 | +using System.Net; |
| 12 | +using System.IO; |
| 13 | +using System.Drawing.Imaging; |
| 14 | +using System.Linq; |
| 15 | +using Newtonsoft.Json; |
| 16 | +using System.Text; |
10 | 17 |
|
11 | 18 | namespace Dracoon.Sdk.SdkInternal { |
12 | 19 | internal class DracoonAccountImpl : IAccount { |
@@ -88,5 +95,72 @@ public void ValidateTokenValidity() { |
88 | 95 | RestRequest request = client.RequestBuilder.GetAuthenticatedPing(); |
89 | 96 | client.RequestExecutor.DoSyncApiCall<VoidResponse>(request, RequestType.GetAuthenticatedPing); |
90 | 97 | } |
| 98 | + |
| 99 | + #region Avatar functions |
| 100 | + |
| 101 | + public Image GetAvatar() { |
| 102 | + ApiAvatarInfo apiAvatarInfo = GetApiAvatarInfoInternally(); |
| 103 | + |
| 104 | + using (WebClient avatarClient = client.RequestBuilder.ProvideAvatarDownloadWebClient()) { |
| 105 | + byte[] avatarImageBytes = client.RequestExecutor.ExecuteWebClientDownload(avatarClient, new Uri(apiAvatarInfo.AvatarUri), RequestType.GetUserAvatar); |
| 106 | + MemoryStream ms = new MemoryStream(avatarImageBytes); |
| 107 | + return Image.FromStream(ms); |
| 108 | + } |
| 109 | + } |
| 110 | + |
| 111 | + public AvatarInfo GetAvatarInfo() { |
| 112 | + ApiAvatarInfo apiAvatarInfo = GetApiAvatarInfoInternally(); |
| 113 | + return UserMapper.FromApiAvatarInfo(apiAvatarInfo); |
| 114 | + } |
| 115 | + |
| 116 | + private ApiAvatarInfo GetApiAvatarInfoInternally() { |
| 117 | + client.RequestExecutor.CheckApiServerVersion(); |
| 118 | + client.RequestExecutor.CheckApiServerVersion(ApiConfig.ApiAvatarFunctions); |
| 119 | + |
| 120 | + RestRequest request = client.RequestBuilder.GetAvatar(); |
| 121 | + ApiAvatarInfo apiAvatarInfo = client.RequestExecutor.DoSyncApiCall<ApiAvatarInfo>(request, RequestType.GetUserAvatar); |
| 122 | + return apiAvatarInfo; |
| 123 | + } |
| 124 | + |
| 125 | + public AvatarInfo ResetAvatar() { |
| 126 | + client.RequestExecutor.CheckApiServerVersion(); |
| 127 | + client.RequestExecutor.CheckApiServerVersion(ApiConfig.ApiAvatarFunctions); |
| 128 | + |
| 129 | + RestRequest request = client.RequestBuilder.DeleteAvatar(); |
| 130 | + ApiAvatarInfo defaultAvatarInfo = client.RequestExecutor.DoSyncApiCall<ApiAvatarInfo>(request, RequestType.DeleteUserAvatar); |
| 131 | + return UserMapper.FromApiAvatarInfo(defaultAvatarInfo); |
| 132 | + } |
| 133 | + |
| 134 | + public AvatarInfo UpdateAvatar(Image newAvatar) { |
| 135 | + client.RequestExecutor.CheckApiServerVersion(); |
| 136 | + client.RequestExecutor.CheckApiServerVersion(ApiConfig.ApiAvatarFunctions); |
| 137 | + |
| 138 | + byte[] avatarBytes = null; |
| 139 | + using (MemoryStream ms = new MemoryStream()) { |
| 140 | + newAvatar.Save(ms, newAvatar.RawFormat); |
| 141 | + avatarBytes = ms.ToArray(); |
| 142 | + } |
| 143 | + |
| 144 | + #region Build multipart |
| 145 | + ImageCodecInfo info = ImageCodecInfo.GetImageDecoders().First(c => c.FormatID == newAvatar.RawFormat.Guid); |
| 146 | + |
| 147 | + string formDataBoundary = "---------------------------" + Guid.NewGuid(); |
| 148 | + byte[] packageHeader = ApiConfig.encoding.GetBytes(string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\n\r\n", formDataBoundary, "file", "avatarImage")); |
| 149 | + byte[] packageFooter = ApiConfig.encoding.GetBytes(string.Format("\r\n--" + formDataBoundary + "--")); |
| 150 | + byte[] multipartFormatedChunkData = new byte[packageHeader.Length + packageFooter.Length + avatarBytes.Length]; |
| 151 | + Buffer.BlockCopy(packageHeader, 0, multipartFormatedChunkData, 0, packageHeader.Length); |
| 152 | + Buffer.BlockCopy(avatarBytes, 0, multipartFormatedChunkData, packageHeader.Length, avatarBytes.Length); |
| 153 | + Buffer.BlockCopy(packageFooter, 0, multipartFormatedChunkData, packageHeader.Length + avatarBytes.Length, packageFooter.Length); |
| 154 | + #endregion |
| 155 | + |
| 156 | + ApiAvatarInfo resultAvatarInfo; |
| 157 | + using (WebClient avatarClient = client.RequestBuilder.ProvideAvatarUploadWebClient(formDataBoundary)) { |
| 158 | + byte[] resultAvatarInfoBytes = client.RequestExecutor.ExecuteWebClientChunkUpload(avatarClient, new Uri(client.ServerUri, ApiConfig.ApiPostAvatar), multipartFormatedChunkData, RequestType.PostUserAvatar); |
| 159 | + resultAvatarInfo = JsonConvert.DeserializeObject<ApiAvatarInfo>(Encoding.UTF8.GetString(resultAvatarInfoBytes)); |
| 160 | + } |
| 161 | + return UserMapper.FromApiAvatarInfo(resultAvatarInfo); |
| 162 | + } |
| 163 | + |
| 164 | + #endregion |
91 | 165 | } |
92 | 166 | } |
0 commit comments