· 4 years ago · Apr 03, 2021, 04:44 PM
1using System;
2using System.IO;
3using System.Collections.Generic;
4using System.Net;
5using System.Net.Http;
6using System.Net.Http.Headers;
7using System.Threading.Tasks;
8using System.Text;
9using System.Text.Json;
10using System.Linq;
11
12namespace oxford
13{
14 class Program
15 {
16 // private static string requestURL = "https://oed-researcher-api.oxfordlanguages.com/oed/api/v0.2/words/?lemma=mail";
17 static readonly HttpClient client = new HttpClient();
18 private static string partialRequestURLWordByLemma = "https://oed-researcher-api.oxfordlanguages.com/oed/api/v0.2/words/?lemma=";
19 // words - lemma query needs words - for the sense query the partial url must have word only
20 private static string partialRequestURL = "https://oed-researcher-api.oxfordlanguages.com/oed/api/v0.2/";
21 // @TODO clean this up
22// public static string wordId = "mail_nn01";
23 // @TODO Implement getting keys
24
25// public static async Task<int> Main(string[] args)
26
27
28
29
30 static void Main(string[] args)
31 {
32 MainAsync().Wait();
33 Console.WriteLine("Press any key to exit.");
34 Console.ReadLine();
35 }
36 static async Task MainAsync()
37 {
38 try
39 {
40 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
41 string wordToSearch = AskForWord();
42 // @TODO enter what type of search to perform
43 var responses = await GetFromAPI(partialRequestURLWordByLemma, wordToSearch);
44 JsonElement responseJSON = responses.RootElement.GetProperty("data");
45 selectRefinement(responseJSON);
46 Console.WriteLine("Program finished");
47 Console.ReadLine();
48 }
49 catch (Exception ex)
50 {
51 Console.WriteLine("Exception in MainAsync()");
52 Console.WriteLine(ex);
53 }
54 }
55
56 public static async Task<JsonDocument> GetFromAPI(string partialURL, string endOfUrl)
57 {
58 // Try just repeating this to get the sense URL get to work
59 try {
60 UserInfo.GetKeys();
61 }
62 catch(Exception ex)
63 {
64 Console.WriteLine("Could not get the API key.");
65 Console.WriteLine($"{ex.GetType()} says {ex.Message}");
66 return null;
67 }
68 try {
69 // var client = new HttpClient();
70 // @TODO do not recreate the client - create a method that calls different headers
71 // From the same client
72 Uri wholeRequestURL = new Uri(partialURL + endOfUrl);
73 client.DefaultRequestHeaders.Accept.Clear();
74 client.DefaultRequestHeaders.Accept.Add(
75 new MediaTypeWithQualityHeaderValue("application/json"));
76 client.DefaultRequestHeaders.Add("app_id", UserInfo.appId);
77 client.DefaultRequestHeaders.Add("app_key", UserInfo.appKey);
78 Console.WriteLine("Here are the request Headers...");
79 Console.WriteLine(client.DefaultRequestHeaders);
80 Console.WriteLine("Here is the request URL:");
81 Console.WriteLine(wholeRequestURL);
82 JsonDocument responses = await JsonDocument.ParseAsync(await client.GetStreamAsync(wholeRequestURL));
83 Console.WriteLine("Got responses--'JsonDocument responses'");
84 return responses;
85 }
86 catch(Exception ex)
87 {
88 Console.WriteLine("HTTP Client in GetFromAPI() failed.");
89 Console.WriteLine($"{ex.GetType()} says {ex.Message}");
90 return null;
91 }
92 }
93
94 public static void GetOrigin(JsonElement responseJSON)
95 {
96 var query = responseJSON.EnumerateArray()
97 .First()
98 .GetProperty("first_use");
99
100 Console.WriteLine("This word is originally from the language:");
101 Console.WriteLine(query);
102 }
103 public static string AskForWord()
104 {
105 Console.WriteLine("Enter word to search:");
106 return Console.ReadLine();
107 }
108
109 public static void selectRefinement(JsonElement responseJSON)
110 {
111 Console.WriteLine("Select your refinement:");
112 Console.WriteLine("Word [O]rigin");
113 Console.WriteLine("Get a list of [S]enses");
114
115 string selectionResponse = Console.ReadLine().ToLower().Trim();
116
117 switch (selectionResponse)
118 {
119 case "o" or "origin":
120 GetOrigin(responseJSON);
121 break;
122 case "s" or "senses":
123
124 string wordIdForSenseQuery = GetWordId(responseJSON);
125 Console.WriteLine("Getting word id for SenseQuery");
126 Console.WriteLine("Word id is....");
127 Console.WriteLine(wordIdForSenseQuery);
128 ConstructSenseQuery(wordIdForSenseQuery).Wait();
129 // DisplaySenses(senseResponseJSON);
130 break;
131 default:
132 Console.WriteLine("I did not understand your selection.");
133 break;
134 }
135 }
136
137 public static string GetWordId(JsonElement responseJSON)
138 {
139 Console.WriteLine("Getting word ID");
140 var id = responseJSON.EnumerateArray()
141 .First()
142 .GetProperty("id");
143 Console.WriteLine(id);
144 return id.ToString();
145 }
146 public static async Task<string> ConstructSenseQuery(string senseId)
147 {
148 Console.WriteLine("Calling the disaster which is ConstructSenseQuery()");
149 Console.ReadLine();
150 try {
151
152 Console.WriteLine("Called ConstructSenseQuery()");
153 string senseQueryString = "word/" + senseId + "/senses/";
154 Console.WriteLine("sense Query String is:");
155 Console.WriteLine(partialRequestURL + senseQueryString);
156 Console.WriteLine("Calling GetFromAPI.");
157 Console.ReadLine();
158 var senseResponse = await GetFromAPI(partialRequestURL, senseQueryString);
159 Console.WriteLine("called GetFromAPI and received senseResponse variable.");
160 Console.WriteLine(senseResponse.ToString());
161 Console.ReadLine();
162 JsonElement senseResponseJSON = senseResponse.RootElement.GetProperty("data");
163 Console.WriteLine("Got JsonDocument object of sense response.");
164 Console.WriteLine("Sense response as string...");
165 Console.WriteLine(senseResponseJSON.ToString());
166 Console.ReadLine();
167 return senseResponse.ToString();
168 }
169 catch (Exception ex) {
170 Console.WriteLine("ConstructSenseQuery threw an exception");
171 Console.WriteLine($"{ex.GetType()} is {ex.ToString()}");
172 Console.ReadLine();
173 return null;
174 }
175 }
176 public static string DisplaySenses(JsonElement senseResponseJSON)
177 {
178 Console.WriteLine("DisplaySenses() called");
179 var sensesForDisplay = senseResponseJSON.EnumerateArray()
180 .First()
181 .GetProperty("notes");
182 Console.WriteLine(sensesForDisplay);
183 return sensesForDisplay.ToString();
184 }
185 }
186}