using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.Linq; using RedditSharp.Things; namespace RedditSharp { using System; public class Wiki { private Reddit Reddit { get; set; } private Subreddit Subreddit { get; set; } private IWebAgent WebAgent { get; set; } private const string GetWikiPageUrl = "/r/{0}/wiki/{1}.json?v={2}"; private const string GetWikiPagesUrl = "/r/{0}/wiki/pages.json"; private const string WikiPageEditUrl = "/r/{0}/api/wiki/edit"; private const string HideWikiPageUrl = "/r/{0}/api/wiki/hide"; private const string RevertWikiPageUrl = "/r/{0}/api/wiki/revert"; private const string WikiPageAllowEditorAddUrl = "/r/{0}/api/wiki/alloweditor/add"; private const string WikiPageAllowEditorDelUrl = "/r/{0}/api/wiki/alloweditor/del"; private const string WikiPageSettingsUrl = "/r/{0}/wiki/settings/{1}.json"; private const string WikiRevisionsUrl = "/r/{0}/wiki/revisions.json"; private const string WikiPageRevisionsUrl = "/r/{0}/wiki/revisions/{1}.json"; private const string WikiPageDiscussionsUrl = "/r/{0}/wiki/discussions/{1}.json"; public IEnumerable PageNames { get { var request = WebAgent.CreateGet(string.Format(GetWikiPagesUrl, Subreddit.Name)); var response = request.GetResponse(); string json = WebAgent.GetResponseString(response.GetResponseStream()); return JObject.Parse(json)["data"].Values(); } } public Listing Revisions { get { return new Listing(Reddit, string.Format(WikiRevisionsUrl, Subreddit.Name), WebAgent); } } protected internal Wiki(Reddit reddit, Subreddit subreddit, IWebAgent webAgent) { Reddit = reddit; Subreddit = subreddit; WebAgent = webAgent; } public WikiPage GetPage(string page, string version = null) { var request = WebAgent.CreateGet(string.Format(GetWikiPageUrl, Subreddit.Name, page, version)); var response = request.GetResponse(); var json = JObject.Parse(WebAgent.GetResponseString(response.GetResponseStream())); var result = new WikiPage(Reddit, json["data"], WebAgent); return result; } #region Settings public WikiPageSettings GetPageSettings(string name) { var request = WebAgent.CreateGet(string.Format(WikiPageSettingsUrl, Subreddit.Name, name)); var response = request.GetResponse(); var json = JObject.Parse(WebAgent.GetResponseString(response.GetResponseStream())); var result = new WikiPageSettings(Reddit, json["data"], WebAgent); return result; } public void SetPageSettings(string name, WikiPageSettings settings) { var request = WebAgent.CreatePost(string.Format(WikiPageSettingsUrl, Subreddit.Name, name)); WebAgent.WritePostBody(request.GetRequestStream(), new { page = name, permlevel = settings.PermLevel, listed = settings.Listed, uh = Reddit.User.Modhash }); var response = request.GetResponse(); } #endregion #region Revisions public Listing GetPageRevisions(string page) { return new Listing(Reddit, string.Format(WikiPageRevisionsUrl, Subreddit.Name, page), WebAgent); } #endregion #region Discussions public Listing GetPageDiscussions(string page) { return new Listing(Reddit, string.Format(WikiPageDiscussionsUrl, Subreddit.Name, page), WebAgent); } #endregion public void EditPage(string page, string content, string previous = null, string reason = null) { var request = WebAgent.CreatePost(string.Format(WikiPageEditUrl, Subreddit.Name)); WebAgent.WritePostBody(request.GetRequestStream(), new { content = content, previous = previous, reason = reason, page = page, uh = Reddit.User.Modhash }); var response = request.GetResponse(); } public void HidePage(string page, string revision) { var request = WebAgent.CreatePost(string.Format(HideWikiPageUrl, Subreddit.Name)); WebAgent.WritePostBody(request.GetRequestStream(), new { page = page, revision = revision, uh = Reddit.User.Modhash }); var response = request.GetResponse(); } public void RevertPage(string page, string revision) { var request = WebAgent.CreatePost(string.Format(RevertWikiPageUrl, Subreddit.Name)); WebAgent.WritePostBody(request.GetRequestStream(), new { page = page, revision = revision, uh = Reddit.User.Modhash }); var response = request.GetResponse(); } public void SetPageEditor(string page, string username, bool allow) { var request = WebAgent.CreatePost(string.Format(allow ? WikiPageAllowEditorAddUrl : WikiPageAllowEditorDelUrl, Subreddit.Name)); WebAgent.WritePostBody(request.GetRequestStream(), new { page = page, username = username, uh = Reddit.User.Modhash }); var response = request.GetResponse(); } #region Obsolete Getter Methods [Obsolete("Use PageNames property instead")] public IEnumerable GetPageNames() { return PageNames; } [Obsolete("Use Revisions property instead")] public Listing GetRevisions() { return Revisions; } #endregion Obsolete Getter Methods } }