/// <summary> /// Populates the page with content passed during navigation. Any saved state is also /// provided when recreating a page from a prior session. /// </summary> /// <param name="sender"> /// The source of the event; typically <see cref="NavigationHelper"/> /// </param> /// <param name="e">Event data that provides both the navigation parameter passed to /// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested and /// a dictionary of state preserved by this page during an earlier /// session. The state will be null the first time a page is visited.</param> private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e) { var jsonObjectString = (string)e.NavigationParameter; var forumInfo = JsonConvert.DeserializeObject <ForumEntity>(jsonObjectString); if (forumInfo == null) { return; } pageTitle.Text = string.Format("New Thread - {0}", forumInfo.Name); _forumEntity = forumInfo; _newThreadEntity = await _threadManager.GetThreadCookies(forumInfo.ForumId); if (_newThreadEntity == null) { var msgDlg = new MessageDialog("You can't make a new thread in this forum!"); await msgDlg.ShowAsync(); Frame.GoBack(); return; } var blankPostIconEntity = new PostIconEntity { Id = 0, Title = "Shit" }; PostIconImage.Source = new BitmapImage(new Uri("ms-appx://Assets/shitpost.gif")); _postIcon = blankPostIconEntity; }
public async Task CreateThreadPreview(NewThreadEntity newThreadEntity) { IsLoading = true; NewThreadEntity = newThreadEntity; try { string result = await _threadManager.CreateNewThreadPreview(NewThreadEntity); if (string.IsNullOrEmpty(result)) { string messageText = string.Format( "No text?! What good is showing you a preview then! Type something in and try again!{0}{1}", Environment.NewLine, Constants.Ascii2); await AwfulDebugger.SendMessageDialogAsync(messageText, new Exception("No text in reply box")); return; } Html = result; } catch (Exception ex) { AwfulDebugger.SendMessageDialogAsync("Failed to get the preview html", ex); } IsLoading = false; }
public async Task <string> CreateNewThreadPreview(NewThreadEntity newThreadEntity) { if (newThreadEntity == null) { return(string.Empty); } var form = new MultipartFormDataContent { { new StringContent("postthread"), "action" }, { new StringContent(newThreadEntity.Forum.ForumId.ToString(CultureInfo.InvariantCulture)), "forumid" }, { new StringContent(newThreadEntity.FormKey), "formkey" }, { new StringContent(newThreadEntity.FormCookie), "form_cookie" }, { new StringContent(newThreadEntity.PostIcon.Id.ToString(CultureInfo.InvariantCulture)), "iconid" }, { new StringContent(HtmlEncode(newThreadEntity.Subject)), "subject" }, { new StringContent(HtmlEncode(newThreadEntity.Content)), "message" }, { new StringContent(newThreadEntity.ParseUrl.ToString()), "parseurl" }, { new StringContent("Submit Post"), "submit" }, { new StringContent("Preview Post"), "preview" } }; // We post to SA the same way we would for a normal reply, but instead of getting a redirect back to the // thread, we'll get redirected to back to the reply screen with the preview message on it. // From here we can parse that preview and return it to the user. HttpResponseMessage response = await _webManager.PostFormData(Constants.NEW_THREAD_BASE, form); Stream stream = await response.Content.ReadAsStreamAsync(); using (var reader = new StreamReader(stream)) { string html = reader.ReadToEnd(); var doc = new HtmlDocument(); doc.LoadHtml(html); HtmlNode[] replyNodes = doc.DocumentNode.Descendants("div").ToArray(); HtmlNode previewNode = replyNodes.FirstOrDefault(node => node.GetAttributeValue("class", "").Equals("inner postbody")); return(previewNode == null ? string.Empty : FixPostHtml(previewNode.OuterHtml)); } }
public async Task <bool> CreateNewThread(NewThreadEntity newThreadEntity) { if (newThreadEntity == null) { return(false); } var form = new MultipartFormDataContent { { new StringContent("postthread"), "action" }, { new StringContent(newThreadEntity.Forum.ForumId.ToString(CultureInfo.InvariantCulture)), "forumid" }, { new StringContent(newThreadEntity.FormKey), "formkey" }, { new StringContent(newThreadEntity.FormCookie), "form_cookie" }, { new StringContent(newThreadEntity.PostIcon.Id.ToString(CultureInfo.InvariantCulture)), "iconid" }, { new StringContent(HtmlEncode(newThreadEntity.Subject)), "subject" }, { new StringContent(HtmlEncode(newThreadEntity.Content)), "message" }, { new StringContent(newThreadEntity.ParseUrl.ToString()), "parseurl" }, { new StringContent("Submit Reply"), "submit" } }; HttpResponseMessage response = await _webManager.PostFormData(Constants.NEW_THREAD_BASE, form); return(response.IsSuccessStatusCode); }
public async Task <NewThreadEntity> GetThreadCookies(long forumId) { try { string url = string.Format(Constants.NEW_THREAD, forumId); WebManager.Result result = await _webManager.GetData(url); HtmlDocument doc = result.Document; HtmlNode[] formNodes = doc.DocumentNode.Descendants("input").ToArray(); HtmlNode formKeyNode = formNodes.FirstOrDefault(node => node.GetAttributeValue("name", "").Equals("formkey")); HtmlNode formCookieNode = formNodes.FirstOrDefault(node => node.GetAttributeValue("name", "").Equals("form_cookie")); var newForumEntity = new NewThreadEntity(); try { string formKey = formKeyNode.GetAttributeValue("value", ""); string formCookie = formCookieNode.GetAttributeValue("value", ""); newForumEntity.FormKey = formKey; newForumEntity.FormCookie = formCookie; return(newForumEntity); } catch (Exception) { throw new InvalidOperationException("Could not parse new thread form data."); } } catch (Exception) { return(null); } }