예제 #1
0
        /// <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;
        }
예제 #3
0
        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));
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
            }
        }