Skip to content

Commit 163f4b7

Browse files
committed
Merge pull request #184 from CrustyJew/master
Change "Reddit" class to allow passing in of custom IWebAgent
2 parents 78de6bb + b652bf3 commit 163f4b7

File tree

2 files changed

+89
-57
lines changed

2 files changed

+89
-57
lines changed

RedditSharp/Reddit.cs

Lines changed: 87 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Security.Authentication;
77
using RedditSharp.Things;
88
using System.Threading.Tasks;
9+
using DefaultWebAgent = RedditSharp.WebAgent;
910

1011
namespace RedditSharp
1112
{
@@ -38,16 +39,15 @@ public class Reddit
3839

3940
static Reddit()
4041
{
41-
WebAgent.UserAgent = "";
42-
WebAgent.RateLimit = WebAgent.RateLimitMode.Pace;
43-
WebAgent.Protocol = "http";
44-
WebAgent.RootDomain = "www.reddit.com";
42+
DefaultWebAgent.UserAgent = "";
43+
DefaultWebAgent.RateLimit = DefaultWebAgent.RateLimitMode.Pace;
44+
DefaultWebAgent.Protocol = "https";
45+
DefaultWebAgent.RootDomain = "www.reddit.com";
4546
}
4647

4748
#endregion
48-
49-
internal readonly IWebAgent _webAgent;
50-
49+
50+
internal IWebAgent WebAgent { get; set; }
5151
/// <summary>
5252
/// Captcha solver instance to use when solving captchas.
5353
/// </summary>
@@ -61,10 +61,10 @@ static Reddit()
6161
/// <summary>
6262
/// Sets the Rate Limiting Mode of the underlying WebAgent
6363
/// </summary>
64-
public WebAgent.RateLimitMode RateLimit
64+
public DefaultWebAgent.RateLimitMode RateLimit
6565
{
66-
get { return WebAgent.RateLimit; }
67-
set { WebAgent.RateLimit = value; }
66+
get { return DefaultWebAgent.RateLimit; }
67+
set { DefaultWebAgent.RateLimit = value; }
6868
}
6969

7070
internal JsonSerializerSettings JsonSerializerSettings { get; set; }
@@ -90,22 +90,24 @@ public Reddit()
9090

9191
public Reddit(bool useSsl)
9292
{
93+
DefaultWebAgent defaultAgent = new DefaultWebAgent();
94+
9395
JsonSerializerSettings = new JsonSerializerSettings
9496
{
9597
CheckAdditionalContent = false,
9698
DefaultValueHandling = DefaultValueHandling.Ignore
9799
};
98-
WebAgent.Protocol = useSsl ? "https" : "http";
99-
_webAgent = new WebAgent();
100+
DefaultWebAgent.Protocol = useSsl ? "https" : "http";
101+
WebAgent = defaultAgent;
100102
CaptchaSolver = new ConsoleCaptchaSolver();
101103
}
102104

103-
public Reddit(WebAgent.RateLimitMode limitMode, bool useSsl = true)
105+
public Reddit(DefaultWebAgent.RateLimitMode limitMode, bool useSsl = true)
104106
: this(useSsl)
105107
{
106-
WebAgent.UserAgent = "";
107-
WebAgent.RateLimit = limitMode;
108-
WebAgent.RootDomain = "www.reddit.com";
108+
DefaultWebAgent.UserAgent = "";
109+
DefaultWebAgent.RateLimit = limitMode;
110+
DefaultWebAgent.RootDomain = "www.reddit.com";
109111
}
110112

111113
public Reddit(string username, string password, bool useSsl = true)
@@ -117,10 +119,40 @@ public Reddit(string username, string password, bool useSsl = true)
117119
public Reddit(string accessToken)
118120
: this(true)
119121
{
120-
WebAgent.RootDomain = OAuthDomainUrl;
121-
_webAgent.AccessToken = accessToken;
122+
DefaultWebAgent.RootDomain = OAuthDomainUrl;
123+
WebAgent.AccessToken = accessToken;
122124
InitOrUpdateUser();
123125
}
126+
/// <summary>
127+
/// Creates a Reddit instance with the given WebAgent implementation
128+
/// </summary>
129+
/// <param name="agent">Implementation of IWebAgent interface. Used to generate requests.</param>
130+
public Reddit(IWebAgent agent)
131+
{
132+
WebAgent = agent;
133+
JsonSerializerSettings = new JsonSerializerSettings
134+
{
135+
CheckAdditionalContent = false,
136+
DefaultValueHandling = DefaultValueHandling.Ignore
137+
};
138+
CaptchaSolver = new ConsoleCaptchaSolver();
139+
}
140+
/// <summary>
141+
/// Creates a Reddit instance with the given WebAgent implementation
142+
/// </summary>
143+
/// <param name="agent">Implementation of IWebAgent interface. Used to generate requests.</param>
144+
/// <param name="initUser">Whether to run InitOrUpdateUser, requires <paramref name="agent"/> to have credentials first.</param>
145+
public Reddit(IWebAgent agent, bool initUser)
146+
{
147+
WebAgent = agent;
148+
JsonSerializerSettings = new JsonSerializerSettings
149+
{
150+
CheckAdditionalContent = false,
151+
DefaultValueHandling = DefaultValueHandling.Ignore
152+
};
153+
CaptchaSolver = new ConsoleCaptchaSolver();
154+
if(initUser) InitOrUpdateUser();
155+
}
124156

125157
/// <summary>
126158
/// Logs in the current Reddit instance.
@@ -133,16 +165,16 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
133165
{
134166
if (Type.GetType("Mono.Runtime") != null)
135167
ServicePointManager.ServerCertificateValidationCallback = (s, c, ch, ssl) => true;
136-
_webAgent.Cookies = new CookieContainer();
168+
WebAgent.Cookies = new CookieContainer();
137169
HttpWebRequest request;
138170
if (useSsl)
139-
request = _webAgent.CreatePost(SslLoginUrl);
171+
request = WebAgent.CreatePost(SslLoginUrl);
140172
else
141-
request = _webAgent.CreatePost(LoginUrl);
173+
request = WebAgent.CreatePost(LoginUrl);
142174
var stream = request.GetRequestStream();
143175
if (useSsl)
144176
{
145-
_webAgent.WritePostBody(stream, new
177+
WebAgent.WritePostBody(stream, new
146178
{
147179
user = username,
148180
passwd = password,
@@ -151,7 +183,7 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
151183
}
152184
else
153185
{
154-
_webAgent.WritePostBody(stream, new
186+
WebAgent.WritePostBody(stream, new
155187
{
156188
user = username,
157189
passwd = password,
@@ -161,7 +193,7 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
161193
}
162194
stream.Close();
163195
var response = (HttpWebResponse)request.GetResponse();
164-
var result = _webAgent.GetResponseString(response.GetResponseStream());
196+
var result = WebAgent.GetResponseString(response.GetResponseStream());
165197
var json = JObject.Parse(result)["json"];
166198
if (json["errors"].Count() != 0)
167199
throw new AuthenticationException("Incorrect login.");
@@ -173,11 +205,11 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
173205

174206
public RedditUser GetUser(string name)
175207
{
176-
var request = _webAgent.CreateGet(string.Format(UserInfoUrl, name));
208+
var request = WebAgent.CreateGet(string.Format(UserInfoUrl, name));
177209
var response = request.GetResponse();
178-
var result = _webAgent.GetResponseString(response.GetResponseStream());
210+
var result = WebAgent.GetResponseString(response.GetResponseStream());
179211
var json = JObject.Parse(result);
180-
return new RedditUser().Init(this, json, _webAgent);
212+
return new RedditUser().Init(this, json, WebAgent);
181213
}
182214

183215
/// <summary>
@@ -187,11 +219,11 @@ public RedditUser GetUser(string name)
187219
/// </summary>
188220
public void InitOrUpdateUser()
189221
{
190-
var request = _webAgent.CreateGet(string.IsNullOrEmpty(_webAgent.AccessToken) ? MeUrl : OAuthMeUrl);
222+
var request = WebAgent.CreateGet(string.IsNullOrEmpty(WebAgent.AccessToken) ? MeUrl : OAuthMeUrl);
191223
var response = (HttpWebResponse)request.GetResponse();
192-
var result = _webAgent.GetResponseString(response.GetResponseStream());
224+
var result = WebAgent.GetResponseString(response.GetResponseStream());
193225
var json = JObject.Parse(result);
194-
User = new AuthenticatedUser().Init(this, json, _webAgent);
226+
User = new AuthenticatedUser().Init(this, json, WebAgent);
195227
}
196228

197229
#region Obsolete Getter Methods
@@ -234,7 +266,7 @@ public Domain GetDomain(string domain)
234266
if (!domain.StartsWith("http://") && !domain.StartsWith("https://"))
235267
domain = "http://" + domain;
236268
var uri = new Uri(domain);
237-
return new Domain(this, uri, _webAgent);
269+
return new Domain(this, uri, WebAgent);
238270
}
239271

240272
public JToken GetToken(Uri uri)
@@ -244,25 +276,25 @@ public JToken GetToken(Uri uri)
244276
if (url.EndsWith("/"))
245277
url = url.Remove(url.Length - 1);
246278

247-
var request = _webAgent.CreateGet(string.Format(GetPostUrl, url));
279+
var request = WebAgent.CreateGet(string.Format(GetPostUrl, url));
248280
var response = request.GetResponse();
249-
var data = _webAgent.GetResponseString(response.GetResponseStream());
281+
var data = WebAgent.GetResponseString(response.GetResponseStream());
250282
var json = JToken.Parse(data);
251283

252284
return json[0]["data"]["children"].First;
253285
}
254286

255287
public Post GetPost(Uri uri)
256288
{
257-
return new Post().Init(this, GetToken(uri), _webAgent);
289+
return new Post().Init(this, GetToken(uri), WebAgent);
258290
}
259291

260292
public void ComposePrivateMessage(string subject, string body, string to, string captchaId = "", string captchaAnswer = "")
261293
{
262294
if (User == null)
263295
throw new Exception("User can not be null.");
264-
var request = _webAgent.CreatePost(ComposeMessageUrl);
265-
_webAgent.WritePostBody(request.GetRequestStream(), new
296+
var request = WebAgent.CreatePost(ComposeMessageUrl);
297+
WebAgent.WritePostBody(request.GetRequestStream(), new
266298
{
267299
api_type = "json",
268300
subject,
@@ -273,7 +305,7 @@ public void ComposePrivateMessage(string subject, string body, string to, string
273305
captcha = captchaAnswer
274306
});
275307
var response = request.GetResponse();
276-
var result = _webAgent.GetResponseString(response.GetResponseStream());
308+
var result = WebAgent.GetResponseString(response.GetResponseStream());
277309
var json = JObject.Parse(result);
278310

279311
ICaptchaSolver solver = CaptchaSolver; // Prevent race condition
@@ -297,8 +329,8 @@ public void ComposePrivateMessage(string subject, string body, string to, string
297329
/// <returns>The newly created user account</returns>
298330
public AuthenticatedUser RegisterAccount(string userName, string passwd, string email = "")
299331
{
300-
var request = _webAgent.CreatePost(RegisterAccountUrl);
301-
_webAgent.WritePostBody(request.GetRequestStream(), new
332+
var request = WebAgent.CreatePost(RegisterAccountUrl);
333+
WebAgent.WritePostBody(request.GetRequestStream(), new
302334
{
303335
api_type = "json",
304336
email = email,
@@ -307,19 +339,19 @@ public AuthenticatedUser RegisterAccount(string userName, string passwd, string
307339
user = userName
308340
});
309341
var response = request.GetResponse();
310-
var result = _webAgent.GetResponseString(response.GetResponseStream());
342+
var result = WebAgent.GetResponseString(response.GetResponseStream());
311343
var json = JObject.Parse(result);
312-
return new AuthenticatedUser().Init(this, json, _webAgent);
344+
return new AuthenticatedUser().Init(this, json, WebAgent);
313345
// TODO: Error
314346
}
315347

316348
public Thing GetThingByFullname(string fullname)
317349
{
318-
var request = _webAgent.CreateGet(string.Format(GetThingUrl, fullname));
350+
var request = WebAgent.CreateGet(string.Format(GetThingUrl, fullname));
319351
var response = request.GetResponse();
320-
var data = _webAgent.GetResponseString(response.GetResponseStream());
352+
var data = WebAgent.GetResponseString(response.GetResponseStream());
321353
var json = JToken.Parse(data);
322-
return Thing.Parse(this, json["data"]["children"][0], _webAgent);
354+
return Thing.Parse(this, json["data"]["children"][0], WebAgent);
323355
}
324356

325357
public Comment GetComment(string subreddit, string name, string linkName)
@@ -343,13 +375,13 @@ public Comment GetComment(string subreddit, string name, string linkName)
343375
public Comment GetComment(Uri uri)
344376
{
345377
var url = string.Format(GetPostUrl, uri.AbsoluteUri);
346-
var request = _webAgent.CreateGet(url);
378+
var request = WebAgent.CreateGet(url);
347379
var response = request.GetResponse();
348-
var data = _webAgent.GetResponseString(response.GetResponseStream());
380+
var data = WebAgent.GetResponseString(response.GetResponseStream());
349381
var json = JToken.Parse(data);
350382

351-
var sender = new Post().Init(this, json[0]["data"]["children"][0], _webAgent);
352-
return new Comment().Init(this, json[1]["data"]["children"][0], _webAgent, sender);
383+
var sender = new Post().Init(this, json[0]["data"]["children"][0], WebAgent);
384+
return new Comment().Init(this, json[1]["data"]["children"][0], WebAgent, sender);
353385
}
354386

355387
public Listing<T> SearchByUrl<T>(string url) where T : Thing
@@ -362,28 +394,28 @@ public Listing<T> Search<T>(string query, Sorting sortE = Sorting.Relevance, Tim
362394
{
363395
string sort = sortE.ToString().ToLower();
364396
string time = timeE.ToString().ToLower();
365-
return new Listing<T>(this, string.Format(SearchUrl, query, sort, time), _webAgent);
397+
return new Listing<T>(this, string.Format(SearchUrl, query, sort, time), WebAgent);
366398
}
367399

368400
#region Helpers
369401

370402
protected async internal Task<T> GetThingAsync<T>(string url) where T : Thing
371403
{
372-
var request = _webAgent.CreateGet(url);
404+
var request = WebAgent.CreateGet(url);
373405
var response = request.GetResponse();
374-
var data = _webAgent.GetResponseString(response.GetResponseStream());
406+
var data = WebAgent.GetResponseString(response.GetResponseStream());
375407
var json = JToken.Parse(data);
376-
var ret = await Thing.ParseAsync(this, json, _webAgent);
408+
var ret = await Thing.ParseAsync(this, json, WebAgent);
377409
return (T)ret;
378410
}
379411

380412
protected internal T GetThing<T>(string url) where T : Thing
381413
{
382-
var request = _webAgent.CreateGet(url);
414+
var request = WebAgent.CreateGet(url);
383415
var response = request.GetResponse();
384-
var data = _webAgent.GetResponseString(response.GetResponseStream());
416+
var data = WebAgent.GetResponseString(response.GetResponseStream());
385417
var json = JToken.Parse(data);
386-
return (T)Thing.Parse(this, json, _webAgent);
418+
return (T)Thing.Parse(this, json, WebAgent);
387419
}
388420

389421
#endregion

RedditSharp/Things/Subreddit.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ public static Subreddit GetRSlashAll(Reddit reddit)
309309
Url = new Uri("/r/all", UriKind.Relative),
310310
Name = "all",
311311
Reddit = reddit,
312-
WebAgent = reddit._webAgent
312+
WebAgent = reddit.WebAgent
313313
};
314314
return rSlashAll;
315315
}
@@ -323,7 +323,7 @@ public static Subreddit GetFrontPage(Reddit reddit)
323323
Url = new Uri("/", UriKind.Relative),
324324
Name = "/",
325325
Reddit = reddit,
326-
WebAgent = reddit._webAgent
326+
WebAgent = reddit.WebAgent
327327
};
328328
return frontPage;
329329
}

0 commit comments

Comments
 (0)