// 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(); }
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)); }
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; }
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; } }
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); }
/// <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); } }
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)); }
/// <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 }
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)); } }
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(); }
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); } } }
/// <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()); }
/// <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>()); }
public string GetFlairCssClass(string user) { var json = WebAgent.CreateAndExecuteRequest(String.Format(FlairListUrl + "?name=" + user, Name)); return((string)json["users"][0]["flair_css_class"]); }
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()); }
/// <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"])); }
/// <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); }
/// <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); }