· 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}