6
6
using System . Security . Authentication ;
7
7
using RedditSharp . Things ;
8
8
using System . Threading . Tasks ;
9
+ using DefaultWebAgent = RedditSharp . WebAgent ;
9
10
10
11
namespace RedditSharp
11
12
{
@@ -38,16 +39,15 @@ public class Reddit
38
39
39
40
static Reddit ( )
40
41
{
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" ;
45
46
}
46
47
47
48
#endregion
48
-
49
- internal readonly IWebAgent _webAgent ;
50
-
49
+
50
+ internal IWebAgent WebAgent { get ; set ; }
51
51
/// <summary>
52
52
/// Captcha solver instance to use when solving captchas.
53
53
/// </summary>
@@ -61,10 +61,10 @@ static Reddit()
61
61
/// <summary>
62
62
/// Sets the Rate Limiting Mode of the underlying WebAgent
63
63
/// </summary>
64
- public WebAgent . RateLimitMode RateLimit
64
+ public DefaultWebAgent . RateLimitMode RateLimit
65
65
{
66
- get { return WebAgent . RateLimit ; }
67
- set { WebAgent . RateLimit = value ; }
66
+ get { return DefaultWebAgent . RateLimit ; }
67
+ set { DefaultWebAgent . RateLimit = value ; }
68
68
}
69
69
70
70
internal JsonSerializerSettings JsonSerializerSettings { get ; set ; }
@@ -90,22 +90,24 @@ public Reddit()
90
90
91
91
public Reddit ( bool useSsl )
92
92
{
93
+ DefaultWebAgent defaultAgent = new DefaultWebAgent ( ) ;
94
+
93
95
JsonSerializerSettings = new JsonSerializerSettings
94
96
{
95
97
CheckAdditionalContent = false ,
96
98
DefaultValueHandling = DefaultValueHandling . Ignore
97
99
} ;
98
- WebAgent . Protocol = useSsl ? "https" : "http" ;
99
- _webAgent = new WebAgent ( ) ;
100
+ DefaultWebAgent . Protocol = useSsl ? "https" : "http" ;
101
+ WebAgent = defaultAgent ;
100
102
CaptchaSolver = new ConsoleCaptchaSolver ( ) ;
101
103
}
102
104
103
- public Reddit ( WebAgent . RateLimitMode limitMode , bool useSsl = true )
105
+ public Reddit ( DefaultWebAgent . RateLimitMode limitMode , bool useSsl = true )
104
106
: this ( useSsl )
105
107
{
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" ;
109
111
}
110
112
111
113
public Reddit ( string username , string password , bool useSsl = true )
@@ -117,10 +119,40 @@ public Reddit(string username, string password, bool useSsl = true)
117
119
public Reddit ( string accessToken )
118
120
: this ( true )
119
121
{
120
- WebAgent . RootDomain = OAuthDomainUrl ;
121
- _webAgent . AccessToken = accessToken ;
122
+ DefaultWebAgent . RootDomain = OAuthDomainUrl ;
123
+ WebAgent . AccessToken = accessToken ;
122
124
InitOrUpdateUser ( ) ;
123
125
}
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
+ }
124
156
125
157
/// <summary>
126
158
/// Logs in the current Reddit instance.
@@ -133,16 +165,16 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
133
165
{
134
166
if ( Type . GetType ( "Mono.Runtime" ) != null )
135
167
ServicePointManager . ServerCertificateValidationCallback = ( s , c , ch , ssl ) => true ;
136
- _webAgent . Cookies = new CookieContainer ( ) ;
168
+ WebAgent . Cookies = new CookieContainer ( ) ;
137
169
HttpWebRequest request ;
138
170
if ( useSsl )
139
- request = _webAgent . CreatePost ( SslLoginUrl ) ;
171
+ request = WebAgent . CreatePost ( SslLoginUrl ) ;
140
172
else
141
- request = _webAgent . CreatePost ( LoginUrl ) ;
173
+ request = WebAgent . CreatePost ( LoginUrl ) ;
142
174
var stream = request . GetRequestStream ( ) ;
143
175
if ( useSsl )
144
176
{
145
- _webAgent . WritePostBody ( stream , new
177
+ WebAgent . WritePostBody ( stream , new
146
178
{
147
179
user = username ,
148
180
passwd = password ,
@@ -151,7 +183,7 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
151
183
}
152
184
else
153
185
{
154
- _webAgent . WritePostBody ( stream , new
186
+ WebAgent . WritePostBody ( stream , new
155
187
{
156
188
user = username ,
157
189
passwd = password ,
@@ -161,7 +193,7 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
161
193
}
162
194
stream . Close ( ) ;
163
195
var response = ( HttpWebResponse ) request . GetResponse ( ) ;
164
- var result = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
196
+ var result = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
165
197
var json = JObject . Parse ( result ) [ "json" ] ;
166
198
if ( json [ "errors" ] . Count ( ) != 0 )
167
199
throw new AuthenticationException ( "Incorrect login." ) ;
@@ -173,11 +205,11 @@ public AuthenticatedUser LogIn(string username, string password, bool useSsl = t
173
205
174
206
public RedditUser GetUser ( string name )
175
207
{
176
- var request = _webAgent . CreateGet ( string . Format ( UserInfoUrl , name ) ) ;
208
+ var request = WebAgent . CreateGet ( string . Format ( UserInfoUrl , name ) ) ;
177
209
var response = request . GetResponse ( ) ;
178
- var result = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
210
+ var result = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
179
211
var json = JObject . Parse ( result ) ;
180
- return new RedditUser ( ) . Init ( this , json , _webAgent ) ;
212
+ return new RedditUser ( ) . Init ( this , json , WebAgent ) ;
181
213
}
182
214
183
215
/// <summary>
@@ -187,11 +219,11 @@ public RedditUser GetUser(string name)
187
219
/// </summary>
188
220
public void InitOrUpdateUser ( )
189
221
{
190
- var request = _webAgent . CreateGet ( string . IsNullOrEmpty ( _webAgent . AccessToken ) ? MeUrl : OAuthMeUrl ) ;
222
+ var request = WebAgent . CreateGet ( string . IsNullOrEmpty ( WebAgent . AccessToken ) ? MeUrl : OAuthMeUrl ) ;
191
223
var response = ( HttpWebResponse ) request . GetResponse ( ) ;
192
- var result = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
224
+ var result = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
193
225
var json = JObject . Parse ( result ) ;
194
- User = new AuthenticatedUser ( ) . Init ( this , json , _webAgent ) ;
226
+ User = new AuthenticatedUser ( ) . Init ( this , json , WebAgent ) ;
195
227
}
196
228
197
229
#region Obsolete Getter Methods
@@ -234,7 +266,7 @@ public Domain GetDomain(string domain)
234
266
if ( ! domain . StartsWith ( "http://" ) && ! domain . StartsWith ( "https://" ) )
235
267
domain = "http://" + domain ;
236
268
var uri = new Uri ( domain ) ;
237
- return new Domain ( this , uri , _webAgent ) ;
269
+ return new Domain ( this , uri , WebAgent ) ;
238
270
}
239
271
240
272
public JToken GetToken ( Uri uri )
@@ -244,25 +276,25 @@ public JToken GetToken(Uri uri)
244
276
if ( url . EndsWith ( "/" ) )
245
277
url = url . Remove ( url . Length - 1 ) ;
246
278
247
- var request = _webAgent . CreateGet ( string . Format ( GetPostUrl , url ) ) ;
279
+ var request = WebAgent . CreateGet ( string . Format ( GetPostUrl , url ) ) ;
248
280
var response = request . GetResponse ( ) ;
249
- var data = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
281
+ var data = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
250
282
var json = JToken . Parse ( data ) ;
251
283
252
284
return json [ 0 ] [ "data" ] [ "children" ] . First ;
253
285
}
254
286
255
287
public Post GetPost ( Uri uri )
256
288
{
257
- return new Post ( ) . Init ( this , GetToken ( uri ) , _webAgent ) ;
289
+ return new Post ( ) . Init ( this , GetToken ( uri ) , WebAgent ) ;
258
290
}
259
291
260
292
public void ComposePrivateMessage ( string subject , string body , string to , string captchaId = "" , string captchaAnswer = "" )
261
293
{
262
294
if ( User == null )
263
295
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
266
298
{
267
299
api_type = "json" ,
268
300
subject ,
@@ -273,7 +305,7 @@ public void ComposePrivateMessage(string subject, string body, string to, string
273
305
captcha = captchaAnswer
274
306
} ) ;
275
307
var response = request . GetResponse ( ) ;
276
- var result = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
308
+ var result = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
277
309
var json = JObject . Parse ( result ) ;
278
310
279
311
ICaptchaSolver solver = CaptchaSolver ; // Prevent race condition
@@ -297,8 +329,8 @@ public void ComposePrivateMessage(string subject, string body, string to, string
297
329
/// <returns>The newly created user account</returns>
298
330
public AuthenticatedUser RegisterAccount ( string userName , string passwd , string email = "" )
299
331
{
300
- var request = _webAgent . CreatePost ( RegisterAccountUrl ) ;
301
- _webAgent . WritePostBody ( request . GetRequestStream ( ) , new
332
+ var request = WebAgent . CreatePost ( RegisterAccountUrl ) ;
333
+ WebAgent . WritePostBody ( request . GetRequestStream ( ) , new
302
334
{
303
335
api_type = "json" ,
304
336
email = email ,
@@ -307,19 +339,19 @@ public AuthenticatedUser RegisterAccount(string userName, string passwd, string
307
339
user = userName
308
340
} ) ;
309
341
var response = request . GetResponse ( ) ;
310
- var result = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
342
+ var result = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
311
343
var json = JObject . Parse ( result ) ;
312
- return new AuthenticatedUser ( ) . Init ( this , json , _webAgent ) ;
344
+ return new AuthenticatedUser ( ) . Init ( this , json , WebAgent ) ;
313
345
// TODO: Error
314
346
}
315
347
316
348
public Thing GetThingByFullname ( string fullname )
317
349
{
318
- var request = _webAgent . CreateGet ( string . Format ( GetThingUrl , fullname ) ) ;
350
+ var request = WebAgent . CreateGet ( string . Format ( GetThingUrl , fullname ) ) ;
319
351
var response = request . GetResponse ( ) ;
320
- var data = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
352
+ var data = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
321
353
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 ) ;
323
355
}
324
356
325
357
public Comment GetComment ( string subreddit , string name , string linkName )
@@ -343,13 +375,13 @@ public Comment GetComment(string subreddit, string name, string linkName)
343
375
public Comment GetComment ( Uri uri )
344
376
{
345
377
var url = string . Format ( GetPostUrl , uri . AbsoluteUri ) ;
346
- var request = _webAgent . CreateGet ( url ) ;
378
+ var request = WebAgent . CreateGet ( url ) ;
347
379
var response = request . GetResponse ( ) ;
348
- var data = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
380
+ var data = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
349
381
var json = JToken . Parse ( data ) ;
350
382
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 ) ;
353
385
}
354
386
355
387
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
362
394
{
363
395
string sort = sortE . ToString ( ) . ToLower ( ) ;
364
396
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 ) ;
366
398
}
367
399
368
400
#region Helpers
369
401
370
402
protected async internal Task < T > GetThingAsync < T > ( string url ) where T : Thing
371
403
{
372
- var request = _webAgent . CreateGet ( url ) ;
404
+ var request = WebAgent . CreateGet ( url ) ;
373
405
var response = request . GetResponse ( ) ;
374
- var data = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
406
+ var data = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
375
407
var json = JToken . Parse ( data ) ;
376
- var ret = await Thing . ParseAsync ( this , json , _webAgent ) ;
408
+ var ret = await Thing . ParseAsync ( this , json , WebAgent ) ;
377
409
return ( T ) ret ;
378
410
}
379
411
380
412
protected internal T GetThing < T > ( string url ) where T : Thing
381
413
{
382
- var request = _webAgent . CreateGet ( url ) ;
414
+ var request = WebAgent . CreateGet ( url ) ;
383
415
var response = request . GetResponse ( ) ;
384
- var data = _webAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
416
+ var data = WebAgent . GetResponseString ( response . GetResponseStream ( ) ) ;
385
417
var json = JToken . Parse ( data ) ;
386
- return ( T ) Thing . Parse ( this , json , _webAgent ) ;
418
+ return ( T ) Thing . Parse ( this , json , WebAgent ) ;
387
419
}
388
420
389
421
#endregion
0 commit comments