using HabiticaTask = Habittodo.Model.Habitica.Task; using ChecklistItem = Habittodo.Model.Habitica.ChecklistItem; using System.Net; using System.Threading.Tasks; using Newtonsoft.Json; using Habittodo.Model.Habitica.Responses; using Habittodo.Model.Habitica.Enums; using System; namespace Habittodo.Service { public class HabiticaServiceClient { private string userId { get; set; } private string apiKey { get; set; } private string baseUrl => "https://habitica.com/api/v3/"; public HabiticaServiceClient(string userId, string apiKey) { this.userId = userId; this.apiKey = apiKey; } public async Task> CreateTask(HabiticaTask task) { using (var client = CreateWebClient()) { var request = JsonConvert.SerializeObject(task); var json = await client.UploadStringTaskAsync($"{baseUrl}/tasks/user", "POST", request); return JsonConvert.DeserializeObject>(json); } } public async Task UpdateTask(HabiticaTask task) { using (var client = CreateWebClient()) { var request = JsonConvert.SerializeObject(task); var json = await client.UploadStringTaskAsync($"{baseUrl}/tasks/{task.Id}", "PUT", request); return JsonConvert.DeserializeObject(json); } } public async Task DeleteTask(string taskId) { using (var client = CreateWebClient()) await client.UploadStringTaskAsync($"{baseUrl}/tasks/{taskId}", "DELETE", ""); } public async Task ScoreTask(string taskId, ScoreAction action) { var actionStr = Enum.GetName(action.GetType(), action).ToLower(); using (var client = CreateWebClient()) await client.UploadStringTaskAsync($"{baseUrl}/tasks/{taskId}/score/{actionStr}", "POST", ""); } //public async Task>> ReadTasks(TaskType taskType = TaskType.Todo) //{ // var taskTypeStr = Enum.GetName(taskType.GetType(), taskType).ToLower(); // using (var client = CreateWebClient()) // { // var json = await client.DownloadStringTaskAsync($"{baseUrl}/tasks/user"); // var response = JsonConvert.DeserializeObject>>(json); // response.Data.RemoveAll(x => x.Type != taskTypeStr); // return response; // } //} //public async Task>> ReadTasks(TaskType taskType = TaskType.Todo) public async Task> CreateChecklistItem(ChecklistItem checklistItem, string taskId) { using (var client = CreateWebClient()) { var request = JsonConvert.SerializeObject(checklistItem); var json = await client.UploadStringTaskAsync($"{baseUrl}/tasks/{taskId}/checklist", "POST", request); return JsonConvert.DeserializeObject>(json); } } public async Task> UpdateChecklistItem(ChecklistItem checklistItem, string taskId) { using (var client = CreateWebClient()) { var request = JsonConvert.SerializeObject(checklistItem); var json = await client.UploadStringTaskAsync($"{baseUrl}/tasks/{taskId}/checklist/{checklistItem.Id}", "PUT", request); return JsonConvert.DeserializeObject>(json); } } public async Task DeleteChecklistItem(string taskId, string checklistItemId) { using (var client = CreateWebClient()) await client.UploadStringTaskAsync($"{baseUrl}/tasks/{taskId}/checklist/{checklistItemId}", "DELETE", ""); } public async Task ScoreChecklistItem(string taskId, string checklistItemId) { using (var client = CreateWebClient()) await client.UploadStringTaskAsync($"{baseUrl}/tasks/{taskId}/checklist/{checklistItemId}/score", "POST", ""); } private WebClient CreateWebClient() { var client = new WebClient(); client.Headers[HttpRequestHeader.ContentType] = "application/json"; client.Headers["x-api-user"] = userId; client.Headers["x-api-key"] = apiKey; client.Headers["x-client"] = "dotnet-habitica-client"; return client; } } }