Inheritance: IWebAgent
Ejemplo n.º 1
0
    // Use this for initialization
    void Start()
    {
        //Have to set up a web agent before initializing a Reddit object, since we need to authenticate.
        DefaultWebAgent defaultAgent = new DefaultWebAgent();

        DefaultWebAgent.UserAgent  = "VReddit";
        DefaultWebAgent.RateLimit  = DefaultWebAgent.RateLimitMode.Pace;
        DefaultWebAgent.Protocol   = "https";
        DefaultWebAgent.RootDomain = "oauth.reddit.com";

        _webAgent     = defaultAgent;
        _authProvider = new AuthProvider(clientID, "", URI, _webAgent);
        string prefixes = URI + "/";

        Debug.Log(prefixes);
        _listener.Prefixes.Add(prefixes);
        _responderMethod = SendResponse;
        Run();
    }
Ejemplo n.º 2
0
        private Post Submit(SubmitData data)
        {
            if (Reddit.User == null)
            {
                throw new RedditException("No user logged in.");
            }
            var request = WebAgent.CreatePost(SubmitLinkUrl);

            WebAgent.WritePostBody(request.GetRequestStream(), data);

            var response = request.GetResponse();
            var result   = WebAgent.GetResponseString(response.GetResponseStream());
            var json     = JToken.Parse(result);

            ICaptchaSolver solver = Reddit.CaptchaSolver;

            if (json["json"]["errors"].Any() && json["json"]["errors"][0][0].ToString() == "BAD_CAPTCHA" &&
                solver != null)
            {
                data.Iden = json["json"]["captcha"].ToString();
                CaptchaResponse captchaResponse = solver.HandleCaptcha(new Captcha(data.Iden));

                // We throw exception due to this method being expected to return a valid Post object, but we cannot
                // if we got a Captcha error.
                if (captchaResponse.Cancel)
                {
                    throw new CaptchaFailedException("Captcha verification failed when submitting " + data.Kind + " post");
                }

                data.Captcha = captchaResponse.Answer;
                return(Submit(data));
            }
            else if (json["json"]["errors"].Any() && json["json"]["errors"][0][0].ToString() == "ALREADY_SUB")
            {
                throw new DuplicateLinkException(String.Format("Post failed when submitting.  The following link has already been submitted: {0}", SubmitLinkUrl));
            }

            return(new Post(Reddit, json["json"], WebAgent));
        }
Ejemplo n.º 3
0
        public void SetFlair(string flairText, string flairClass)
        {
            if (Reddit.User == null)
            {
                throw new Exception("No user logged in.");
            }

            var request = WebAgent.CreatePost(SetFlairUrl);

            WebAgent.WritePostBody(request.GetRequestStream(), new
            {
                api_type  = "json",
                r         = Subreddit,
                css_class = flairClass,
                link      = FullName,
                //name = Name,
                text = flairText,
                uh   = Reddit.User.Modhash
            });
            WebAgent.ExecuteRequest(request);
            LinkFlairText = flairText;
        }
Ejemplo n.º 4
0
        public void SetVote(VoteType type)
        {
            if (this.Vote == type)
            {
                return;
            }

            var request = WebAgent.CreatePost(VoteUrl);
            var stream  = request.GetRequestStream();

            WebAgent.WritePostBody(stream, new
            {
                dir = (int)type,
                id  = FullName,
                uh  = Reddit.User.Modhash
            });
            stream.Close();
            var response = request.GetResponse();
            var data     = WebAgent.GetResponseString(response.GetResponseStream());

            if (Liked == true)
            {
                Upvotes--;
            }
            if (Liked == false)
            {
                Downvotes--;
            }

            switch (type)
            {
            case VoteType.Upvote: Liked = true; Upvotes++; return;

            case VoteType.None: Liked = null; return;

            case VoteType.Downvote: Liked = false; Downvotes++; return;
            }
        }
Ejemplo n.º 5
0
        public IEnumerable <ModeratorUser> GetModerators()
        {
            var request        = WebAgent.CreateGet(string.Format(ModeratorsUrl, Name));
            var response       = request.GetResponse();
            var responseString = WebAgent.GetResponseString(response.GetResponseStream());
            var json           = JObject.Parse(responseString);
            var type           = json["kind"].ToString();

            if (type != "UserList")
            {
                throw new FormatException("Reddit responded with an object that is not a user listing.");
            }
            var data   = json["data"];
            var mods   = data["children"].ToArray();
            var result = new ModeratorUser[mods.Length];

            for (var i = 0; i < mods.Length; i++)
            {
                var mod = new ModeratorUser(Reddit, mods[i]);
                result[i] = mod;
            }
            return(result);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Get a <see cref="JToken"/> from a url.
        /// </summary>
        /// <param name="uri">uri to fetch</param>
        /// <param name="isLive">bool indicating if it's a live thread or not</param>
        /// <returns></returns>
        public JToken GetToken(Uri uri, bool isLive = false)
        {
            var url = uri.AbsoluteUri;

            if (url.EndsWith("/"))
            {
                url = url.Remove(url.Length - 1);
            }

            var request  = WebAgent.CreateGet(string.Format(GetPostUrl, url));
            var response = request.GetResponse();
            var data     = WebAgent.GetResponseString(response.GetResponseStream());
            var json     = JToken.Parse(data);

            if (isLive)
            {
                return(json);
            }
            else
            {
                return(json[0]["data"]["children"].First);
            }
        }
Ejemplo n.º 7
0
        public Comment Comment(string message)
        {
            if (Reddit.User == null)
            {
                throw new AuthenticationException("No user logged in.");
            }
            var request = WebAgent.CreatePost(CommentUrl);
            var stream  = request.GetRequestStream();

            WebAgent.WritePostBody(stream, new
            {
                text     = message,
                thing_id = FullName,
                uh       = Reddit.User.Modhash
            });
            stream.Close();
            var response = request.GetResponse();
            var data     = WebAgent.GetResponseString(response.GetResponseStream());
            var json     = JObject.Parse(data);
            var comment  = json["jquery"].FirstOrDefault(i => i[0].Value <int>() == 18 && i[1].Value <int>() == 19);

            return(new Comment(Reddit, comment[3][0][0], WebAgent));
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Submits a text post in the current subreddit using the logged-in user
        /// </summary>
        /// <param name="title">The title of the submission</param>
        /// <param name="text">The raw markdown text of the submission</param>
        public Post SubmitTextPost(string title, string text)
        {
            if (Reddit.User == null)
            {
                throw new Exception("No user logged in.");
            }
            var request = WebAgent.CreatePost(SubmitLinkUrl);

            WebAgent.WritePostBody(request.GetRequestStream(), new
            {
                api_type = "json",
                kind     = "self",
                sr       = Name,
                text     = text,
                title    = title,
                uh       = Reddit.User.Modhash
            });
            var response = request.GetResponse();
            var result   = WebAgent.GetResponseString(response.GetResponseStream());
            var json     = JToken.Parse(result);

            return(new Post(Reddit, json["json"], WebAgent));
            // TODO: Error
        }
Ejemplo n.º 9
0
 public SubredditSettings GetSettings()
 {
     if (Reddit.User == null)
     {
         throw new AuthenticationException("No user logged in.");
     }
     try
     {
         var request  = WebAgent.CreateGet(string.Format(GetSettingsUrl, Name));
         var response = request.GetResponse();
         var data     = WebAgent.GetResponseString(response.GetResponseStream());
         var json     = JObject.Parse(data);
         return(new SubredditSettings(this, Reddit, json, WebAgent));
     }
     catch // TODO: More specific catch
     {
         // Do it unauthed
         var request  = WebAgent.CreateGet(string.Format(GetReducedSettingsUrl, Name));
         var response = request.GetResponse();
         var data     = WebAgent.GetResponseString(response.GetResponseStream());
         var json     = JObject.Parse(data);
         return(new SubredditSettings(this, Reddit, json, WebAgent));
     }
 }
Ejemplo n.º 10
0
        public void EditPage(string page, string content, string previous = null, string reason = null)
        {
            var     request = WebAgent.CreatePost(string.Format(WikiPageEditUrl, Subreddit.Name));
            dynamic param   = new
            {
                content = content,
                page    = page,
                uh      = Reddit.User.Modhash
            };
            List <string> addParams = new List <string>();

            if (previous != null)
            {
                addParams.Add("previous");
                addParams.Add(previous);
            }
            if (reason != null)
            {
                addParams.Add("reason");
                addParams.Add(reason);
            }
            WebAgent.WritePostBody(request.GetRequestStream(), param, addParams.ToArray());
            var response = request.GetResponse();
        }
Ejemplo n.º 11
0
        public void ComposePrivateMessage(string subject, string body, string to, string captchaId = "", string captchaAnswer = "")
        {
            if (User == null)
            {
                throw new Exception("User can not be null.");
            }
            var request = WebAgent.CreatePost(ComposeMessageUrl);

            request.InitWebReqProxy();
            WebAgent.WritePostBody(request.GetRequestStream(), new
            {
                api_type = "json",
                subject,
                text = body,
                to,
                uh      = User.Modhash,
                iden    = captchaId,
                captcha = captchaAnswer
            });
            var response = request.GetResponse();
            var result   = WebAgent.GetResponseString(response.GetResponseStream());
            var json     = JObject.Parse(result);

            ICaptchaSolver solver = CaptchaSolver; // Prevent race condition

            if (json["json"]["errors"].Any() && json["json"]["errors"][0][0].ToString() == "BAD_CAPTCHA" && solver != null)
            {
                captchaId = json["json"]["captcha"].ToString();
                CaptchaResponse captchaResponse = solver.HandleCaptcha(new Captcha(captchaId));

                if (!captchaResponse.Cancel) // Keep trying until we are told to cancel
                {
                    ComposePrivateMessage(subject, body, to, captchaId, captchaResponse.Answer);
                }
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Update the subreddit settings.
        /// </summary>
        public void UpdateSettings()
        {
            var    request = WebAgent.CreatePost(SiteAdminUrl);
            var    stream  = request.GetRequestStream();
            string link_type;
            string type;
            string wikimode;

            switch (ContentOptions)
            {
            case ContentOptions.All:
                link_type = "any";
                break;

            case ContentOptions.LinkOnly:
                link_type = "link";
                break;

            default:
                link_type = "self";
                break;
            }
            switch (SubredditType)
            {
            case SubredditType.Public:
                type = "public";
                break;

            case SubredditType.Private:
                type = "private";
                break;

            default:
                type = "restricted";
                break;
            }
            switch (WikiEditMode)
            {
            case WikiEditMode.All:
                wikimode = "anyone";
                break;

            case WikiEditMode.Moderators:
                wikimode = "modonly";
                break;

            default:
                wikimode = "disabled";
                break;
            }
            WebAgent.WritePostBody(stream, new
            {
                allow_top    = AllowAsDefault,
                allow_images = AllowImages,
                description  = Sidebar,
                domain       = Domain,
                lang         = Language,
                link_type,
                over_18            = NSFW,
                public_description = PublicDescription,
                show_media         = ShowThumbnails,
                sr    = Subreddit.FullName,
                title = Title,
                type,
                uh              = Reddit.User.Modhash,
                wiki_edit_age   = WikiEditAge,
                wiki_edit_karma = WikiEditKarma,
                wikimode,
                spam_links     = SpamFilter?.LinkPostStrength.ToString().ToLowerInvariant(),
                spam_selfposts = SpamFilter?.SelfPostStrength.ToString().ToLowerInvariant(),
                spam_comments  = SpamFilter?.CommentStrength.ToString().ToLowerInvariant(),
                api_type       = "json"
            }, "header-title", HeaderHoverText);
            stream.Close();
            var response = request.GetResponse();
            var data     = WebAgent.GetResponseString(response.GetResponseStream());
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Get a list of wiki page names for this subreddit.
        /// </summary>
        public async Task <IEnumerable <string> > GetPageNamesAsync()
        {
            var json = await WebAgent.Get(GetWikiPagesUrl).ConfigureAwait(false);

            return(json["data"].Values <string>());
        }
Ejemplo n.º 14
0
        public string GetFlairCssClass(string user)
        {
            var json = WebAgent.CreateAndExecuteRequest(String.Format(FlairListUrl + "?name=" + user, Name));

            return((string)json["users"][0]["flair_css_class"]);
        }
Ejemplo n.º 15
0
        public void UpdateSettings()
        {
            var    request = WebAgent.CreatePost(SiteAdminUrl);
            var    stream  = request.GetRequestStream();
            string link_type;
            string type;
            string wikimode;
            string suggested_comment_sort;

            switch (ContentOptions)
            {
            case ContentOptions.All:
                link_type = "any";
                break;

            case ContentOptions.LinkOnly:
                link_type = "link";
                break;

            default:
                link_type = "self";
                break;
            }
            switch (SubredditType)
            {
            case SubredditType.Public:
                type = "public";
                break;

            case SubredditType.Private:
                type = "private";
                break;

            case SubredditType.GoldRestricted:
                type = "gold_restricted";
                break;

            case SubredditType.Archived:
                type = "archived";
                break;

            case SubredditType.GoldOnly:
                type = "gold_only";
                break;

            case SubredditType.EmployeesOnly:
                type = "employees_only";
                break;

            default:
                type = "restricted";
                break;
            }
            switch (WikiEditMode)
            {
            case WikiEditMode.All:
                wikimode = "anyone";
                break;

            case WikiEditMode.Moderators:
                wikimode = "modonly";
                break;

            default:
                wikimode = "disabled";
                break;
            }
            switch (SuggestedCommentSort)
            {
            case CommentSorts.Confidence:
                suggested_comment_sort = "confidence";
                break;

            case CommentSorts.Top:
                suggested_comment_sort = "top";
                break;

            case CommentSorts.New:
                suggested_comment_sort = "new";
                break;

            case CommentSorts.Controversial:
                suggested_comment_sort = "controversial";
                break;

            case CommentSorts.Old:
                suggested_comment_sort = "old";
                break;

            case CommentSorts.Random:
                suggested_comment_sort = "random";
                break;

            case CommentSorts.Qa:
                suggested_comment_sort = "qa";
                break;

            default:
                suggested_comment_sort = string.Empty;
                break;
            }

            WebAgent.WritePostBody(stream, new
            {
                allow_top    = AllowAsDefault,
                allow_images = AllowImages,
                collapse_deleted_comments = CollapseDeletedComments,
                comment_score_hide_mins   = MinutesToHideCommentScores,
                description             = Sidebar,
                exclude_banned_modqueue = ExcludeBannedModqueue,
                domain   = Domain,
                hide_ads = HideAds,
                lang     = Language,
                link_type,
                over_18            = NSFW,
                public_description = PublicDescription,
                public_traffic     = IsTrafficPublic,
                show_media         = ShowThumbnails,
                show_media_preview = ShowMediaPreviews,
                sr = Subreddit.FullName,
                submit_link_label = SubmitLinkLabel,
                submit_text       = SubmitText,
                submit_text_label = SubmitTextLabel,
                suggested_comment_sort,
                title = Title,
                type,
                uh              = Reddit.User.Modhash,
                wiki_edit_age   = WikiEditAge,
                wiki_edit_karma = WikiEditKarma,
                wikimode,
                spam_links     = SpamFilter == null ? null : SpamFilter.LinkPostStrength.ToString().ToLowerInvariant(),
                spam_selfposts = SpamFilter == null ? null : SpamFilter.SelfPostStrength.ToString().ToLowerInvariant(),
                spam_comments  = SpamFilter == null ? null : SpamFilter.CommentStrength.ToString().ToLowerInvariant(),
                api_type       = "json"
            }, "header-title", HeaderHoverText);
            stream.Close();
            var response = request.GetResponse();
            var data     = WebAgent.GetResponseString(response.GetResponseStream());
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Get wiki settings for specified wiki page.
        /// </summary>
        /// <param name="name">wiki page</param>
        /// <returns></returns>
        public async Task <WikiPageSettings> GetPageSettingsAsync(string name)
        {
            var json = await WebAgent.Get(WikiPageSettingsUrl(name)).ConfigureAwait(false);

            return(new WikiPageSettings(WebAgent, json["data"]));
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Get a wiki page
        /// </summary>
        /// <param name="page">wiki page name</param>
        /// <param name="version">page version</param>
        /// <returns></returns>
        public async Task <WikiPage> GetPageAsync(string page, string version = null)
        {
            var json = await WebAgent.Get(GetWikiPageUrl(page, version)).ConfigureAwait(false);

            return(new WikiPage(WebAgent, json["data"]));
        }
        /// <summary>
        /// Update the subreddit settings.
        /// </summary>
        public async Task UpdateSettings()
        {
            string link_type;
            string type;
            string wikimode;

            switch (ContentOptions)
            {
            case ContentOptions.All:
                link_type = "any";
                break;

            case ContentOptions.LinkOnly:
                link_type = "link";
                break;

            default:
                link_type = "self";
                break;
            }
            switch (SubredditType)
            {
            case SubredditType.Archived:
                type = "archived";
                break;

            case SubredditType.EmployeesOnly:
                type = "employees_only";
                break;

            case SubredditType.GoldOnly:
                type = "gold_only";
                break;

            case SubredditType.GoldRestricted:
                type = "gold_restricted";
                break;

            case SubredditType.Private:
                type = "private";
                break;

            case SubredditType.Public:
                type = "public";
                break;

            case SubredditType.Restricted:
                type = "restricted";
                break;

            case SubredditType.User:
                type = "user";
                break;

            default:
                type = "public";
                break;
            }
            switch (WikiEditMode)
            {
            case WikiEditMode.All:
                wikimode = "anyone";
                break;

            case WikiEditMode.Moderators:
                wikimode = "modonly";
                break;

            default:
                wikimode = "disabled";
                break;
            }
            await WebAgent.Post(SiteAdminUrl, new
            {
                allow_top    = AllowAsDefault,
                allow_images = AllowImages,
                description  = Sidebar,
                domain       = Domain,
                lang         = Language,
                link_type,
                over18             = NSFW,
                public_description = PublicDescription,
                show_media         = ShowThumbnails,
                sr    = Subreddit.FullName,
                title = Title,
                type,
                wiki_edit_age   = WikiEditAge,
                wiki_edit_karma = WikiEditKarma,
                wikimode,
                spam_links     = SpamFilter?.LinkPostStrength.ToString().ToLowerInvariant(),
                spam_selfposts = SpamFilter?.SelfPostStrength.ToString().ToLowerInvariant(),
                spam_comments  = SpamFilter?.CommentStrength.ToString().ToLowerInvariant(),
                api_type       = "json"
            }, "header-title", HeaderHoverText).ConfigureAwait(false);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Update the subreddit settings.
        /// </summary>
        public async Task UpdateSettings()
        {
            string link_type;
            string type;
            string wikimode;
            string suggested_comment_sort = null;

            switch (ContentOptions)
            {
            case ContentOptions.All:
                link_type = "any";
                break;

            case ContentOptions.LinkOnly:
                link_type = "link";
                break;

            default:
                link_type = "self";
                break;
            }

            switch (SubredditType)
            {
            case SubredditType.Archived:
                type = "archived";
                break;

            case SubredditType.EmployeesOnly:
                type = "employees_only";
                break;

            case SubredditType.GoldOnly:
                type = "gold_only";
                break;

            case SubredditType.GoldRestricted:
                type = "gold_restricted";
                break;

            case SubredditType.Private:
                type = "private";
                break;

            case SubredditType.Public:
                type = "public";
                break;

            case SubredditType.Restricted:
                type = "restricted";
                break;

            case SubredditType.User:
                type = "user";
                break;

            default:
                type = "public";
                break;
            }

            switch (WikiEditMode)
            {
            case WikiEditMode.All:
                wikimode = "anyone";
                break;

            case WikiEditMode.Moderators:
                wikimode = "modonly";
                break;

            default:
                wikimode = "disabled";
                break;
            }

            if (SuggestedCommentSort.HasValue)
            {
                switch (SuggestedCommentSort)
                {
                case RedditSharp.SuggestedCommentSort.Confidence:
                    suggested_comment_sort = "confidence";
                    break;

                case RedditSharp.SuggestedCommentSort.Top:
                    suggested_comment_sort = "top";
                    break;

                case RedditSharp.SuggestedCommentSort.New:
                    suggested_comment_sort = "new";
                    break;

                case RedditSharp.SuggestedCommentSort.Controversial:
                    suggested_comment_sort = "controversial";
                    break;

                case RedditSharp.SuggestedCommentSort.Old:
                    suggested_comment_sort = "old";
                    break;

                case RedditSharp.SuggestedCommentSort.Random:
                    suggested_comment_sort = "random";
                    break;

                case RedditSharp.SuggestedCommentSort.Qa:
                    suggested_comment_sort = "qa";
                    break;

                case RedditSharp.SuggestedCommentSort.Live:
                    suggested_comment_sort = "live";
                    break;
                }
            }

            await WebAgent.Post(SiteAdminUrl, new
            {
                allow_top    = AllowAsDefault,
                allow_images = AllowImages,
                description  = Sidebar,
                domain       = Domain,
                lang         = Language,
                link_type,
                over18             = NSFW,
                public_description = PublicDescription,
                show_media         = ShowThumbnails,
                sr    = Subreddit.FullName,
                title = Title,
                type,
                wiki_edit_age   = WikiEditAge,
                wiki_edit_karma = WikiEditKarma,
                wikimode,
                spam_links                = SpamFilter?.LinkPostStrength.ToString().ToLowerInvariant(),
                spam_selfposts            = SpamFilter?.SelfPostStrength.ToString().ToLowerInvariant(),
                spam_comments             = SpamFilter?.CommentStrength.ToString().ToLowerInvariant(),
                free_form_reports         = FreeFormReports,
                submit_text               = SubmitText,
                collapse_deleted_comments = CollapseDeletedComments,
                allow_videos              = AllowVideos,
                suggested_comment_sort,
                spoilers_enabled             = SpoilersEnabled,
                original_content_tag_enabled = OriginalContentTagEnabled,
                submit_link_label            = SubmitLinkLabel,
                allow_post_crossposts        = AllowPostCrossposts,
                public_traffic          = PublicTraffic,
                submit_text_label       = SubmitTextLabel,
                all_original_content    = AllOriginalContent,
                hide_ads                = HideAds,
                allow_discovery         = AllowDiscovery,
                show_media_preview      = ShowMediaPreview,
                comment_score_hide_mins = CommentScoreHideMins,
                exclude_banned_modqueue = ExcludeBannedModqueue,
                api_type                = "json"
            }, "header-title", HeaderHoverText).ConfigureAwait(false);
        }