Skip to content

Instantly share code, notes, and snippets.

@ZeroBugBounce
Created March 29, 2013 21:28
Show Gist options
  • Save ZeroBugBounce/5273788 to your computer and use it in GitHub Desktop.
Save ZeroBugBounce/5273788 to your computer and use it in GitHub Desktop.
Helps to create the URLs for the Reddit API in C#
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