First actual commit
added sources to repository
This commit is contained in:
264
RedditSharp/SubredditSettings.cs
Normal file
264
RedditSharp/SubredditSettings.cs
Normal file
@@ -0,0 +1,264 @@
|
||||
using System.Web;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using RedditSharp.Things;
|
||||
|
||||
namespace RedditSharp
|
||||
{
|
||||
public class SubredditSettings
|
||||
{
|
||||
private const string SiteAdminUrl = "/api/site_admin";
|
||||
private const string DeleteHeaderImageUrl = "/api/delete_sr_header";
|
||||
|
||||
private Reddit Reddit { get; set; }
|
||||
private IWebAgent WebAgent { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public Subreddit Subreddit { get; set; }
|
||||
|
||||
public SubredditSettings(Reddit reddit, Subreddit subreddit, IWebAgent webAgent)
|
||||
{
|
||||
Subreddit = subreddit;
|
||||
Reddit = reddit;
|
||||
WebAgent = webAgent;
|
||||
// Default settings, for use when reduced information is given
|
||||
AllowAsDefault = true;
|
||||
Domain = null;
|
||||
Sidebar = string.Empty;
|
||||
Language = "en";
|
||||
Title = Subreddit.DisplayName;
|
||||
WikiEditKarma = 100;
|
||||
WikiEditAge = 10;
|
||||
UseDomainCss = false;
|
||||
UseDomainSidebar = false;
|
||||
HeaderHoverText = string.Empty;
|
||||
NSFW = false;
|
||||
PublicDescription = string.Empty;
|
||||
WikiEditMode = WikiEditMode.None;
|
||||
SubredditType = SubredditType.Public;
|
||||
ShowThumbnails = true;
|
||||
ContentOptions = ContentOptions.All;
|
||||
SpamFilter = new SpamFilterSettings();
|
||||
}
|
||||
|
||||
public SubredditSettings(Subreddit subreddit, Reddit reddit, JObject json, IWebAgent webAgent) : this(reddit, subreddit, webAgent)
|
||||
{
|
||||
var data = json["data"];
|
||||
AllowAsDefault = data["default_set"].ValueOrDefault<bool>();
|
||||
Domain = data["domain"].ValueOrDefault<string>();
|
||||
Sidebar = HttpUtility.HtmlDecode(data["description"].ValueOrDefault<string>() ?? string.Empty);
|
||||
Language = data["language"].ValueOrDefault<string>();
|
||||
Title = data["title"].ValueOrDefault<string>();
|
||||
WikiEditKarma = data["wiki_edit_karma"].ValueOrDefault<int>();
|
||||
UseDomainCss = data["domain_css"].ValueOrDefault<bool>();
|
||||
UseDomainSidebar = data["domain_sidebar"].ValueOrDefault<bool>();
|
||||
HeaderHoverText = data["header_hover_text"].ValueOrDefault<string>();
|
||||
NSFW = data["over_18"].ValueOrDefault<bool>();
|
||||
PublicDescription = HttpUtility.HtmlDecode(data["public_description"].ValueOrDefault<string>() ?? string.Empty);
|
||||
SpamFilter = new SpamFilterSettings
|
||||
{
|
||||
LinkPostStrength = GetSpamFilterStrength(data["spam_links"].ValueOrDefault<string>()),
|
||||
SelfPostStrength = GetSpamFilterStrength(data["spam_selfposts"].ValueOrDefault<string>()),
|
||||
CommentStrength = GetSpamFilterStrength(data["spam_comments"].ValueOrDefault<string>())
|
||||
};
|
||||
if (data["wikimode"] != null)
|
||||
{
|
||||
var wikiMode = data["wikimode"].ValueOrDefault<string>();
|
||||
switch (wikiMode)
|
||||
{
|
||||
case "disabled":
|
||||
WikiEditMode = WikiEditMode.None;
|
||||
break;
|
||||
case "modonly":
|
||||
WikiEditMode = WikiEditMode.Moderators;
|
||||
break;
|
||||
case "anyone":
|
||||
WikiEditMode = WikiEditMode.All;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (data["subreddit_type"] != null)
|
||||
{
|
||||
var type = data["subreddit_type"].ValueOrDefault<string>();
|
||||
switch (type)
|
||||
{
|
||||
case "public":
|
||||
SubredditType = SubredditType.Public;
|
||||
break;
|
||||
case "private":
|
||||
SubredditType = SubredditType.Private;
|
||||
break;
|
||||
case "restricted":
|
||||
SubredditType = SubredditType.Restricted;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ShowThumbnails = data["show_media"].ValueOrDefault<bool>();
|
||||
WikiEditAge = data["wiki_edit_age"].ValueOrDefault<int>();
|
||||
if (data["content_options"] != null)
|
||||
{
|
||||
var contentOptions = data["content_options"].ValueOrDefault<string>();
|
||||
switch (contentOptions)
|
||||
{
|
||||
case "any":
|
||||
ContentOptions = ContentOptions.All;
|
||||
break;
|
||||
case "link":
|
||||
ContentOptions = ContentOptions.LinkOnly;
|
||||
break;
|
||||
case "self":
|
||||
ContentOptions = ContentOptions.SelfOnly;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool AllowAsDefault { get; set; }
|
||||
public string Domain { get; set; }
|
||||
public string Sidebar { get; set; }
|
||||
public string Language { get; set; }
|
||||
public string Title { get; set; }
|
||||
public int WikiEditKarma { get; set; }
|
||||
public bool UseDomainCss { get; set; }
|
||||
public bool UseDomainSidebar { get; set; }
|
||||
public string HeaderHoverText { get; set; }
|
||||
public bool NSFW { get; set; }
|
||||
public string PublicDescription { get; set; }
|
||||
public WikiEditMode WikiEditMode { get; set; }
|
||||
public SubredditType SubredditType { get; set; }
|
||||
public bool ShowThumbnails { get; set; }
|
||||
public int WikiEditAge { get; set; }
|
||||
public ContentOptions ContentOptions { get; set; }
|
||||
public SpamFilterSettings SpamFilter { get; set; }
|
||||
|
||||
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,
|
||||
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 == 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>
|
||||
/// Resets the subreddit's header image to the Reddit logo
|
||||
/// </summary>
|
||||
public void ResetHeaderImage()
|
||||
{
|
||||
var request = WebAgent.CreatePost(DeleteHeaderImageUrl);
|
||||
var stream = request.GetRequestStream();
|
||||
WebAgent.WritePostBody(stream, new
|
||||
{
|
||||
uh = Reddit.User.Modhash,
|
||||
r = Subreddit.Name
|
||||
});
|
||||
stream.Close();
|
||||
var response = request.GetResponse();
|
||||
var data = WebAgent.GetResponseString(response.GetResponseStream());
|
||||
}
|
||||
|
||||
private SpamFilterStrength GetSpamFilterStrength(string rawValue)
|
||||
{
|
||||
switch(rawValue)
|
||||
{
|
||||
case "low":
|
||||
return SpamFilterStrength.Low;
|
||||
case "high":
|
||||
return SpamFilterStrength.High;
|
||||
case "all":
|
||||
return SpamFilterStrength.All;
|
||||
default:
|
||||
return SpamFilterStrength.High;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum WikiEditMode
|
||||
{
|
||||
None,
|
||||
Moderators,
|
||||
All
|
||||
}
|
||||
|
||||
public enum SubredditType
|
||||
{
|
||||
Public,
|
||||
Restricted,
|
||||
Private
|
||||
}
|
||||
|
||||
public enum ContentOptions
|
||||
{
|
||||
All,
|
||||
LinkOnly,
|
||||
SelfOnly
|
||||
}
|
||||
|
||||
public enum SpamFilterStrength
|
||||
{
|
||||
Low,
|
||||
High,
|
||||
All
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user