Created
March 29, 2013 21:28
-
-
Save ZeroBugBounce/5273788 to your computer and use it in GitHub Desktop.
Helps to create the URLs for the Reddit API in C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
namespace ZeroBugBounce.ReddShift | |
{ | |
public class RedditUrlBuilder | |
{ | |
// http://www.reddit.com/top/?sort=top&t=week | |
internal const string FrontPageSubredditName = "<front page>"; | |
public const string RedditUrl = @"http://www.reddit.com"; | |
public SubredditUrlBuilder FrontPage() | |
{ | |
return Subreddit(FrontPageSubredditName); | |
} | |
public SubredditUrlBuilder Subreddit(String subredditName) | |
{ | |
return new SubredditUrlBuilder(subredditName); | |
} | |
public CommentsUrlBuilder Comments(String permalink) | |
{ | |
return new CommentsUrlBuilder(permalink); | |
} | |
} | |
public class CommentsUrlBuilder | |
{ | |
string permaLink; | |
string returnType; | |
public CommentsUrlBuilder(string permaLink) | |
{ | |
this.permaLink = permaLink; | |
} | |
public CommentsUrlBuilder Json() | |
{ | |
returnType = ".json"; | |
return this; | |
} | |
public CommentsUrlBuilder Xml() | |
{ | |
returnType = ".xml"; | |
return this; | |
} | |
public override string ToString() | |
{ | |
return RedditUrlBuilder.RedditUrl + permaLink + returnType; | |
} | |
} | |
public class SubredditUrlBuilder | |
{ | |
String subredditName; | |
string returnType; | |
string sort; // for new, top | |
string timespan; // for top: today, week, month, all | |
string tab; | |
string countAfter; | |
public SubredditUrlBuilder(String subredditName) | |
{ | |
this.subredditName = subredditName; | |
} | |
public SubredditUrlBuilder Json() | |
{ | |
returnType = ".json"; | |
return this; | |
} | |
public SubredditUrlBuilder CountAfter(int count, string after) | |
{ | |
countAfter = "count=" + count.ToString() + "&after=" + after; | |
return this; | |
} | |
public SubredditUrlBuilder Xml() | |
{ | |
returnType = ".xml"; | |
return this; | |
} | |
public SubredditUrlBuilder Tab(Tab selectedTab) | |
{ | |
tab = selectedTab.ToString().ToLowerInvariant(); | |
return this; | |
} | |
public SubredditUrlBuilder Hot() | |
{ | |
tab = "hot"; | |
return this; | |
} | |
public SubredditUrlBuilder New() | |
{ | |
tab = "new"; | |
// sort = "new"; | |
return this; | |
} | |
public SubredditUrlBuilder Rising() | |
{ | |
tab = "rising"; | |
return this; | |
} | |
public SubredditUrlBuilder Top() | |
{ | |
tab = "top"; | |
return this; | |
} | |
public SubredditUrlBuilder Top(TopSort topSort) | |
{ | |
tab = "top"; | |
timespan = topSort.ToString().ToLowerInvariant(); | |
return this; | |
} | |
public SubredditUrlBuilder About() | |
{ | |
tab = "about"; | |
return this; | |
} | |
public enum TopSort : int | |
{ | |
Hour = 1, | |
Day, | |
Week, | |
Month, | |
Year, | |
All | |
} | |
public override string ToString() | |
{ | |
var urlStringBuilder = new StringBuilder(RedditUrlBuilder.RedditUrl, 100); | |
urlStringBuilder.Append(@"/"); | |
if (subredditName != RedditUrlBuilder.FrontPageSubredditName) | |
{ | |
urlStringBuilder.Append(@"r/"); | |
urlStringBuilder.Append(subredditName); | |
urlStringBuilder.Append(@"/"); | |
if (!String.IsNullOrEmpty(tab)) | |
{ | |
urlStringBuilder.Append(tab); | |
urlStringBuilder.Append(@"/"); | |
} | |
} | |
if (!String.IsNullOrEmpty(returnType)) | |
{ | |
urlStringBuilder.Append(returnType); | |
} | |
bool hasQueryStringDelimiter = false; | |
if (tab == "top" && !String.IsNullOrEmpty(timespan)) | |
{ | |
urlStringBuilder.Append("?t="); | |
urlStringBuilder.Append(timespan); | |
hasQueryStringDelimiter = true; | |
} | |
else if (tab == "new") | |
{ | |
urlStringBuilder.Append("?sort="); | |
urlStringBuilder.Append(sort); | |
hasQueryStringDelimiter = true; | |
} | |
if (!String.IsNullOrEmpty(countAfter)) | |
{ | |
if (!hasQueryStringDelimiter) | |
{ | |
urlStringBuilder.Append("?"); | |
} | |
urlStringBuilder.Append(countAfter); | |
} | |
return urlStringBuilder.ToString(); | |
} | |
} | |
public enum Tab | |
{ | |
Hot = 1, | |
New, | |
Rising, | |
Controversial, | |
Top | |
} | |
public enum TopTimespan | |
{ | |
Hour = 1, | |
Today, | |
Week, | |
Month, | |
Year, | |
AllTime | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment