/// <summary> /// Initializes a new instance of the <see cref="ExerciseSubmissionApi"/> class. /// </summary> /// <param name="account">The instance of the <see cref="Account"/> class to use to store the OAuth 2.0 account /// credentials.</param> /// <param name="activity">The user activity to submit.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="activity"/> is <c>null</c>.</exception> public ExerciseSubmissionApi(Account account, UserActivity activity) : base(Config.TellOPConfiguration.GetEndpointAsUri("TellOP.API.Exercise"), HttpMethod.Post, account) { if (activity == null) { throw new ArgumentNullException("activity"); } this.PostBody = "id=" + Uri.EscapeDataString(activity.ActivityId.ToString(System.Globalization.CultureInfo.InvariantCulture)); if (activity is UserActivityEssay) { UserActivityEssay essay = activity as UserActivityEssay; this.PostBody += "&type=" + UserActivityEssay.UserActivityType + "&text=" + Uri.EscapeDataString(essay.Text); } else if (activity is UserActivityDictionarySearch) { UserActivityDictionarySearch dictSearch = activity as UserActivityDictionarySearch; this.PostBody += "&type=" + UserActivityDictionarySearch.UserActivityType + "&word=" + Uri.EscapeDataString(dictSearch.Word); } else { throw new ArgumentException("The activity type is not supported at this time", "activity"); } }
/// <summary> /// Save the current search online. /// </summary> /// <param name="word">String searched</param> /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns> private static async Task SaveDictionarySearchAsync(string word) { UserActivityDictionarySearch dictSearch = new UserActivityDictionarySearch() { ActivityId = BritishEnglishDictionarySearchID, Word = word }; Tools.Logger.Log("DictionaryLog", "Start logging procedure (ID: " + dictSearch.ActivityId + ", Word: " + dictSearch.Word + ")"); ExerciseSubmissionApi dictSearchSubmissionEndpoint = new ExerciseSubmissionApi(App.OAuth2Account, dictSearch); Tools.Logger.Log("DictionaryLog", "Send data to the server"); Task dictSearchSubmissionTask = Task.Run(async() => await dictSearchSubmissionEndpoint.CallEndpointAsync()); await dictSearchSubmissionTask; if (dictSearchSubmissionTask.IsFaulted) { Tools.Logger.Log("DictionaryLog", "Exception", dictSearchSubmissionTask.Exception); // Prevent the inner exception from terminating the program. foreach (Exception ex in dictSearchSubmissionTask.Exception.InnerExceptions) { Tools.Logger.Log("DictionaryLog", "Inner exception", ex); } } else { Tools.Logger.Log("DictionaryLog", "Data received. Everything is OK!"); } }
/// <summary> /// Converts an <see cref="Activity"/> to the most specific subclass of <see cref="Exercise"/> and fills in the /// relevant details. /// </summary> /// <param name="activity">An instance of <see cref="Activity"/> containing the data returned by an API /// endpoint.</param> /// <returns>A subclass of <see cref="Exercise"/> containing the data converted from <paramref name="activity"/>. /// </returns> /// <exception cref="ArgumentNullException">Thrown if <paramref name="activity"/> is <c>null</c>.</exception> /// <exception cref="NotImplementedException">Thrown if <paramref name="activity"/> is an activity type that is /// not supported by the app at this time.</exception> public static Exercise ConvertActivityToExercise(Activity activity) { if (activity == null) { throw new ArgumentNullException("activity"); } if (activity.GetType() == typeof(ActivityEssay)) { ActivityEssay resultEssay = (ActivityEssay)activity; EssayExercise essay = new EssayExercise() { Title = resultEssay.Title, Description = resultEssay.Description, MinimumWords = resultEssay.MinimumWords, MaximumWords = resultEssay.MaximumWords, PreliminaryText = resultEssay.PreliminaryText, Contents = (resultEssay.UserActivity != null) ? ((UserActivityEssay)resultEssay.UserActivity).Text : string.Empty, Featured = resultEssay.Featured, Uid = resultEssay.Id, Language = resultEssay.Language, Level = resultEssay.Level }; foreach (string tag in resultEssay.Tags) { essay.Tags.Add(tag); } UserActivity uActivity = resultEssay.UserActivity; if (uActivity != null) { UserActivityEssay uActivityEss = uActivity as UserActivityEssay; if (uActivityEss != null) { if (!string.IsNullOrEmpty(uActivityEss.Text)) { essay.Contents = uActivityEss.Text; } } } return(essay); } if (activity.GetType() == typeof(ActivityDictionarySearch)) { ActivityDictionarySearch resultDictSearch = (ActivityDictionarySearch)activity; DictionarySearchExercise dictionarySearch = new DictionarySearchExercise() { Featured = resultDictSearch.Featured, Uid = resultDictSearch.Id, Language = resultDictSearch.Language, Level = resultDictSearch.Level }; UserActivity uActivity = resultDictSearch.UserActivity; if (uActivity != null) { UserActivityDictionarySearch uActivityDs = uActivity as UserActivityDictionarySearch; if (uActivityDs != null) { if (!string.IsNullOrEmpty(uActivityDs.Word)) { dictionarySearch.Word = uActivityDs.Word; } } } return(dictionarySearch); } throw new NotImplementedException("The returned exercise type is not supported yet"); }