From 1480efdd8216084b2fc9d3c08b388e61a7309983 Mon Sep 17 00:00:00 2001 From: Adam R Grey Date: Mon, 3 Apr 2023 00:36:53 -0400 Subject: [PATCH] several more methods --- Program.cs | 15 +++++++++++- ttrss/ApiClient.cs | 60 ++++++++++++++++++++++++++++++---------------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/Program.cs b/Program.cs index ec7e20e..dc7cc27 100644 --- a/Program.cs +++ b/Program.cs @@ -9,8 +9,21 @@ namespace ttrss_co_client var conf = Configure(); var ttrssClient = new ttrss.ApiClient(conf.BaseURI); await ttrssClient.Login(conf.Username, conf.Password); + + var loggedin = await ttrssClient.IsLoggedIn(); + Console.WriteLine($"logged in: {loggedin}"); + var apiLevel = await ttrssClient.GetApiLevel(); - Console.WriteLine(apiLevel); + Console.WriteLine($"api level: {apiLevel}"); + + var unread = await ttrssClient.GetUnread(); + Console.WriteLine($"{unread} unread article{(unread == 1 ? "" : "s")}"); + + var loggedout = await ttrssClient.Logout(); + Console.WriteLine($"logged out: {loggedout}"); + + loggedin = await ttrssClient.IsLoggedIn(); + Console.WriteLine($"logged in: {loggedin}"); } static Configuration Configure(string configurationPath = "appsettings.json") { diff --git a/ttrss/ApiClient.cs b/ttrss/ApiClient.cs index 8f9838d..76910e2 100644 --- a/ttrss/ApiClient.cs +++ b/ttrss/ApiClient.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.ComponentModel; using Newtonsoft.Json; using System.Net.Http.Json; @@ -11,7 +12,7 @@ namespace ttrss_co_client.ttrss public Uri BaseURI { get; private set; } private HttpClient httpClient { get; set; } private string SessionId { get; set; } = null; - private int api_level{get;set;} + private int api_level { get; set; } public ApiClient(Uri baseUri) { @@ -45,36 +46,26 @@ namespace ttrss_co_client.ttrss public async Task GetApiLevel() { assertInitialized(); - - var json =JsonContent.Create(new - { - op = "getApiLevel", - sid = this.SessionId - }); - var response = await (await httpClient.PostAsync(BaseURI, json)).Content.ReadAsStringAsync(); - var apiResult = JsonConvert.DeserializeObject(response); - int level = 0; - if(int.TryParse(apiResult.Content["level"], out level)) - return level; - else - return 0; + return await oneValueGet("getApiLevel", "level"); } public async Task Logout() { assertInitialized(); - throw new NotImplementedException(); + + return (await oneValueGet("logout", "status"))?.ToLower() == "ok"; } public async Task IsLoggedIn() { - assertInitialized(); - throw new NotImplementedException(); + //assertInitialized(); + return (await oneValueGet("isLoggedIn", "status")); } public async Task GetUnread() { assertInitialized(); - throw new NotImplementedException(); + return await oneValueGet("getUnread", "unread"); } + public async Task GetFeeds(int cat_id, bool unread_only, int limit, int offset, bool include_nested) { assertInitialized(); @@ -155,7 +146,7 @@ namespace ttrss_co_client.ttrss public async Task GetLabels(int? article_id) { assertInitialized(); - if(article_id != null) + if (article_id != null) { assertApiLevel(5); } @@ -171,7 +162,7 @@ namespace ttrss_co_client.ttrss { assertInitialized(); assertApiLevel(4); - if(!sanitize) + if (!sanitize) assertApiLevel(20); throw new NotImplementedException(); } @@ -206,10 +197,37 @@ namespace ttrss_co_client.ttrss } private void assertApiLevel(int ApiLevel) { - if(ApiLevel > this.api_level) + if (ApiLevel > this.api_level) { throw new NotSupportedException($"method requires api level {ApiLevel}, have {this.api_level}"); } } + + + private async Task oneValueGet(string op, string key) + { + //mostly you post {"op": "aThingToDo", "sid": "sessionId", "some other param": "some other value"} + //and get back something like {"seq": 0, "status", "content": {"the value you asked for": 0}} + var json = JsonContent.Create(new + { + op = op, + sid = this.SessionId + }); + var response = await (await httpClient.PostAsync(BaseURI, json)).Content.ReadAsStringAsync(); + var apiResult = JsonConvert.DeserializeObject(response); + try + { + var converter = TypeDescriptor.GetConverter(typeof(T)); + if (converter != null) + { + return (T)converter.ConvertFromString(apiResult.Content[key]); + } + return default(T); + } + catch (NotSupportedException) + { + return default(T); + } + } } } \ No newline at end of file