Rubbit 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/lib/Rubbit.rb +66 -6
- data/lib/Rubbit/Reddit_Net_Wrapper.rb +1 -0
- data/lib/Rubbit/Rubbit_Construction_Layer.rb +1 -1
- data/lib/Rubbit/Rubbit_Objects.rb +183 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NjljN2VjOTY3MGYwMjg4YzY5YWU3MTExNTc4MDE5NzEyYTI1OGY5OQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZWQ3MTc4YTY5MjQyYzcxMDk3YjViZjE1NTA3NDU3NDk0NDg0MDkwMQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
N2JmNmRkMmJjOGIxZDc0MDY2NmU2OWVhZTE1YjlhZTEwYzA2NTE1ZTY5ZDVm
|
10
|
+
OGViM2ZkMjdiMzk5ZDk2M2I0MWVlNzc3ZWVhMzNhZWY3ZjI4M2VmMDgwOTVl
|
11
|
+
NTA1OTE5NmIzY2VlYTliMzI0ZjkxY2M5MWJlNzZkMzhjZjExYjk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NmM3ZGIyYWZlZGYwYjBkZWY4YmFmYmNmMWFjYWQ5ZDkzNDI4ZjcxM2VhY2Fl
|
14
|
+
MWE1MDYwMTBmMjJjYzk5MWJjMzRkYzNjNzcwYzExZDc4YmUwMjgzYTM3Mjg4
|
15
|
+
ZDk1MTI4MGFhMzBlMzJlOGU5NGIzMDk3NGFkNzZhMTFmNWE0NTk=
|
data/lib/Rubbit.rb
CHANGED
@@ -2,9 +2,20 @@ require 'Rubbit/Rubbit_Objects'
|
|
2
2
|
require 'Rubbit/Rubbit_Construction_Layer'
|
3
3
|
require 'io/console'
|
4
4
|
|
5
|
+
# == Rubbit Client
|
6
|
+
#
|
7
|
+
# Contains highest level Rubbit functionality
|
8
|
+
#
|
5
9
|
class Rubbit
|
6
10
|
attr_accessor :client_name, :object_builder, :rubbit_poster, :me
|
7
11
|
|
12
|
+
# ==== Description
|
13
|
+
#
|
14
|
+
# Initialize the Rubbit client with an ID that's added to the user agent
|
15
|
+
#
|
16
|
+
# ==== Attributes
|
17
|
+
#
|
18
|
+
# * +name+ - Attribute that identifies the bot using Rubbit. Is added to the user-agent.
|
8
19
|
def initialize(name)
|
9
20
|
@client_name = name
|
10
21
|
@object_builder = Rubbit_Object_Builder.instance(name)
|
@@ -12,18 +23,49 @@ class Rubbit
|
|
12
23
|
@me = nil
|
13
24
|
end
|
14
25
|
|
26
|
+
# ==== Description
|
27
|
+
#
|
28
|
+
# Gets a Subreddit object, created by subreddit name
|
29
|
+
#
|
30
|
+
# ==== Attributes
|
31
|
+
#
|
32
|
+
# * +display_name+ - Display name of the subreddit a user wishes to create an object representation for
|
15
33
|
def get_subreddit(display_name)
|
16
34
|
return @object_builder.build_subreddit(display_name)
|
17
35
|
end
|
18
36
|
|
37
|
+
# ==== Description
|
38
|
+
#
|
39
|
+
# Gets a Redditor object, created by username
|
40
|
+
#
|
41
|
+
# ==== Attributes
|
42
|
+
#
|
43
|
+
# * +user+ - That Redditor's username
|
19
44
|
def get_redditor(user)
|
20
45
|
return @object_builder.build_user(user)
|
21
46
|
end
|
22
47
|
|
48
|
+
# ==== Description
|
49
|
+
#
|
50
|
+
# Gets a Subreddit object, created by subreddit name
|
51
|
+
#
|
52
|
+
# ==== Attributes
|
53
|
+
#
|
54
|
+
# * +display_name+ - Display name of the subreddit a user wishes to create an object representation for
|
23
55
|
def set_request_period(period)
|
24
56
|
@object_builder.set_request_period(period)
|
25
57
|
end
|
26
58
|
|
59
|
+
# ==== Description
|
60
|
+
#
|
61
|
+
# Login to Reddit and create a session.
|
62
|
+
# User and passwd are *not* required. This function will prompt the user for missing information at runtime.
|
63
|
+
#
|
64
|
+
# ==== Attributes
|
65
|
+
#
|
66
|
+
# * +user+ - Username that you wish to log in with
|
67
|
+
# * +passwd+ - Password required to log in with that user
|
68
|
+
#
|
27
69
|
def login(user=nil,passwd=nil)
|
28
70
|
if(user==nil)
|
29
71
|
print('Enter username: ')
|
@@ -38,17 +80,35 @@ class Rubbit
|
|
38
80
|
return @me
|
39
81
|
end
|
40
82
|
|
41
|
-
|
83
|
+
# ==== Description
|
84
|
+
#
|
85
|
+
# Clears the current session.
|
86
|
+
#
|
87
|
+
# ==== Attributes
|
88
|
+
#
|
89
|
+
# * +curpass+ - Password required to log in with that user
|
90
|
+
#
|
91
|
+
def clear_session(curpass=nil)
|
42
92
|
if(@me==nil)
|
43
93
|
print('Not logged in. No session to clear')
|
44
94
|
elsif(curpass==nil)
|
45
95
|
print('Enter password for '+user.to_s+': ')
|
46
96
|
passwd = STDIN.noecho(&:gets).chomp
|
47
97
|
end
|
48
|
-
return @rubbit_poster.clear_sessions(curpass
|
49
|
-
end
|
50
|
-
|
51
|
-
|
98
|
+
return @rubbit_poster.clear_sessions(curpass)
|
99
|
+
end
|
100
|
+
|
101
|
+
# ==== Description
|
102
|
+
#
|
103
|
+
# Deletes desired user. Requires auth info for that user.
|
104
|
+
#
|
105
|
+
# ==== Attributes
|
106
|
+
#
|
107
|
+
# * +user+ - Username of account you wish to delete.
|
108
|
+
# * +passwd+ - Password required to log in with that user
|
109
|
+
# * +message+ - Reason for deleting account.
|
110
|
+
#
|
111
|
+
def delete_user(user=nil,passwd=nil,message="")
|
52
112
|
confirm = nil
|
53
113
|
if(user==nil)
|
54
114
|
print('Enter username: ')
|
@@ -71,7 +131,7 @@ class Rubbit
|
|
71
131
|
end
|
72
132
|
end
|
73
133
|
|
74
|
-
return @rubbit_poster.delete_user(user,passwd,confirm,message
|
134
|
+
return @rubbit_poster.delete_user(user,passwd,confirm,message)
|
75
135
|
end
|
76
136
|
|
77
137
|
def get_me()
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'Rubbit/Reddit_Net_Wrapper'
|
2
2
|
require 'Rubbit/Rubbit_Exceptions'
|
3
3
|
|
4
|
-
# ==
|
4
|
+
# == Rubbit Object
|
5
|
+
#
|
5
6
|
# Object Representing a Subreddit.
|
7
|
+
#
|
6
8
|
class Subreddit
|
7
9
|
def initialize(json)
|
8
10
|
if(json['kind']=='t5')
|
@@ -170,8 +172,8 @@ class Subreddit
|
|
170
172
|
#
|
171
173
|
# * +limit+ - Maximum entries that the returned ContentGenerator will hold. For no limit, use *nil*
|
172
174
|
#
|
173
|
-
def get_moderators
|
174
|
-
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/about/moderators.json',
|
175
|
+
def get_moderators
|
176
|
+
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/about/moderators.json',nil)
|
175
177
|
end
|
176
178
|
|
177
179
|
|
@@ -250,6 +252,12 @@ class Subreddit
|
|
250
252
|
end
|
251
253
|
end
|
252
254
|
|
255
|
+
# == Rubbit Object
|
256
|
+
#
|
257
|
+
# Object Representing a Redditor.
|
258
|
+
# If the requested Redditor is logged in, this object also contains a modhash.
|
259
|
+
# If obtained from a subreddit list, this object will need to be rebuilt using the rebuild function
|
260
|
+
#
|
253
261
|
class Redditor
|
254
262
|
def initialize(json)
|
255
263
|
if(json['kind']=='t2')
|
@@ -267,18 +275,49 @@ class Redditor
|
|
267
275
|
end
|
268
276
|
end
|
269
277
|
|
278
|
+
# ==== Description
|
279
|
+
#
|
280
|
+
# Function for getting user overview content from a profile, including both comments and posts
|
281
|
+
#
|
282
|
+
# ==== Attributes
|
283
|
+
#
|
284
|
+
# * +limit+ - Maximum entries that the ContentGenerator can contain
|
285
|
+
# * +sort+ - Sort order by which the content is returned
|
286
|
+
#
|
270
287
|
def get_overview(limit=100,sort='new')
|
271
288
|
return ContentGenerator.new('http://www.reddit.com/user/'+@name.to_s+'/.json?sort='+sort,limit)
|
272
289
|
end
|
273
290
|
|
291
|
+
# ==== Description
|
292
|
+
#
|
293
|
+
# Function for getting user comment from a profile
|
294
|
+
#
|
295
|
+
# ==== Attributes
|
296
|
+
#
|
297
|
+
# * +limit+ - Maximum entries that the ContentGenerator can contain
|
298
|
+
# * +sort+ - Sort order by which the content is returned
|
299
|
+
#
|
274
300
|
def get_comments(limit=100,sort='new')
|
275
301
|
return ContentGenerator.new('http://www.reddit.com/user/'+@name.to_s+'/comments.json?sort='+sort,limit)
|
276
302
|
end
|
277
303
|
|
304
|
+
# ==== Description
|
305
|
+
#
|
306
|
+
# Function for getting user posts from a profile
|
307
|
+
#
|
308
|
+
# ==== Attributes
|
309
|
+
#
|
310
|
+
# * +limit+ - Maximum entries that the ContentGenerator can contain
|
311
|
+
# * +sort+ - Sort order by which the content is returned
|
312
|
+
#
|
278
313
|
def get_submitted(limit=100,sort='new')
|
279
314
|
return ContentGenerator.new('http://www.reddit.com/user/'+@name.to_s+'/submitted.json?sort='+sort,limit)
|
280
315
|
end
|
281
316
|
|
317
|
+
# ==== Description
|
318
|
+
#
|
319
|
+
# Function for rebuilding user object using data from their profile page
|
320
|
+
#
|
282
321
|
def rebuild
|
283
322
|
rebuilt_user = Rubbit_Object_Builder.instance.build_user(@name)
|
284
323
|
rebuilt_user.instance_variables.each do |attr_name|
|
@@ -288,6 +327,10 @@ class Redditor
|
|
288
327
|
end
|
289
328
|
end
|
290
329
|
|
330
|
+
# == Rubbit Object
|
331
|
+
#
|
332
|
+
# Enumerable object that allows a user to iterate over data sets
|
333
|
+
#
|
291
334
|
class ContentGenerator
|
292
335
|
include Enumerable
|
293
336
|
@limit = nil
|
@@ -297,6 +340,18 @@ class ContentGenerator
|
|
297
340
|
@after = nil
|
298
341
|
@modhash = nil
|
299
342
|
@index
|
343
|
+
@limit_param
|
344
|
+
|
345
|
+
# ==== Description
|
346
|
+
#
|
347
|
+
# Initializes a ContentGenerator Object
|
348
|
+
#
|
349
|
+
# ==== Attributes
|
350
|
+
#
|
351
|
+
# * +source+ - *Required.* Link to the .json page for the content
|
352
|
+
# * +limit+ - Maximum number of entries the ContentGenerator will load. *nil* for no limit.
|
353
|
+
# * +after+ - ID of entry to load content after.
|
354
|
+
#
|
300
355
|
def initialize(source,limit=100,after='')
|
301
356
|
@source = source
|
302
357
|
@limit = limit
|
@@ -304,19 +359,28 @@ class ContentGenerator
|
|
304
359
|
@data = []
|
305
360
|
@after = after
|
306
361
|
@index = 0
|
362
|
+
if(@source.include?('?'))
|
363
|
+
@limit_param = '&limit='
|
364
|
+
else
|
365
|
+
@limit_param = '?limit='
|
366
|
+
end
|
307
367
|
end
|
308
368
|
|
369
|
+
# ==== Description
|
370
|
+
#
|
371
|
+
# Iterates over the content from a specific source until there is no content left or until a limit is reached
|
372
|
+
#
|
309
373
|
def each
|
310
374
|
if(@data.length==0)
|
311
375
|
if(@limit!=nil)
|
312
376
|
if(@limit-@count>0)
|
313
|
-
listing = Rubbit_Object_Builder.instance.build_listing(@source+
|
377
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+@limit_param+[@limit-@count,100].min.to_s+"&after="+@after+"&count="+@count.to_s)
|
314
378
|
@after = listing.after
|
315
379
|
@data += listing.children
|
316
380
|
@count += listing.children.length
|
317
381
|
end
|
318
382
|
else
|
319
|
-
listing = Rubbit_Object_Builder.instance.build_listing(@source+
|
383
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+@limit_param+100.to_s+"&after="+@after+"&count="+@count.to_s)
|
320
384
|
@after = listing.after
|
321
385
|
@data += listing.children
|
322
386
|
@count+= listing.children.length
|
@@ -332,14 +396,14 @@ class ContentGenerator
|
|
332
396
|
end
|
333
397
|
if(@limit!=nil)
|
334
398
|
if(@limit-@count>0)
|
335
|
-
listing = Rubbit_Object_Builder.instance.build_listing(@source+
|
399
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+@limit_param+[@limit-@count,100].min.to_s+"&after="+@after+"&count="+@count.to_s)
|
336
400
|
@after = listing.after
|
337
401
|
@data += listing.children
|
338
402
|
@count += listing.children.length
|
339
403
|
end
|
340
404
|
else
|
341
|
-
listing = Rubbit_Object_Builder.instance.build_listing(@source+
|
342
|
-
puts(@source+
|
405
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+@limit_param+100.to_s+"&after="+@after+"&count="+@count.to_s)
|
406
|
+
puts(@source+@limit_param+100.to_s+"&after="+@after+"&count="+@count.to_s)
|
343
407
|
@after = listing.after
|
344
408
|
@data += listing.children
|
345
409
|
@count += listing.children.length
|
@@ -348,10 +412,22 @@ class ContentGenerator
|
|
348
412
|
end
|
349
413
|
end
|
350
414
|
|
351
|
-
|
352
|
-
|
415
|
+
# ==== Description
|
416
|
+
#
|
417
|
+
# Returns an object in the ContentGenerator at a particular index. Only works after it has been iterated through and loaded.
|
418
|
+
#
|
419
|
+
# ==== Attributes
|
420
|
+
#
|
421
|
+
# * +index+ - The index of the object in the ContentGenerator that will be returned.
|
422
|
+
#
|
423
|
+
def [](index)
|
424
|
+
return @data[index]
|
353
425
|
end
|
354
426
|
|
427
|
+
# ==== Description
|
428
|
+
#
|
429
|
+
# Returns the next object in the ContentGenerator. If none is loaded, it will try to load more, until a limit is reached.
|
430
|
+
#
|
355
431
|
def next
|
356
432
|
if(@index>=@data.length)
|
357
433
|
if(@limit!=nil)
|
@@ -376,6 +452,10 @@ class ContentGenerator
|
|
376
452
|
return to_return
|
377
453
|
end
|
378
454
|
|
455
|
+
# ==== Description
|
456
|
+
#
|
457
|
+
# Returns the previous object in the ContentGenerator. If the index is at 0, nil is returned
|
458
|
+
#
|
379
459
|
def prev
|
380
460
|
if(@index>1)
|
381
461
|
@index-=1
|
@@ -385,15 +465,31 @@ class ContentGenerator
|
|
385
465
|
end
|
386
466
|
end
|
387
467
|
|
388
|
-
|
389
|
-
|
468
|
+
# ==== Description
|
469
|
+
#
|
470
|
+
# Resets the index of the current entry in ContentGenerator
|
471
|
+
#
|
472
|
+
# ==== Attributes
|
473
|
+
#
|
474
|
+
# * +index+ - The index that the ContentGenerator will be set to. Defaults to 0.
|
475
|
+
#
|
476
|
+
def reset_generator(index=0)
|
477
|
+
@index=index
|
390
478
|
end
|
391
479
|
|
480
|
+
# ==== Description
|
481
|
+
#
|
482
|
+
# Returns the length of data already loaded into the ContentGenerator.
|
483
|
+
#
|
392
484
|
def length
|
393
485
|
return @data.length
|
394
486
|
end
|
395
487
|
end
|
396
488
|
|
489
|
+
# == Rubbit Object
|
490
|
+
#
|
491
|
+
# Object that represents an individual comment
|
492
|
+
#
|
397
493
|
class Comment
|
398
494
|
def initialize(json)
|
399
495
|
if(json['kind']=='t1')
|
@@ -417,23 +513,51 @@ class Comment
|
|
417
513
|
end
|
418
514
|
end
|
419
515
|
|
516
|
+
# ==== Description
|
517
|
+
#
|
518
|
+
# Submits a reply to a comment.
|
519
|
+
#
|
520
|
+
# ==== Attributes
|
521
|
+
#
|
522
|
+
# * +text+ - The body of the response
|
523
|
+
#
|
420
524
|
def reply(text)
|
421
525
|
Rubbit_Poster.instance.comment(@name,text)
|
422
526
|
end
|
423
527
|
|
528
|
+
# ==== Description
|
529
|
+
#
|
530
|
+
# Deletes this comment. Only works if the comment was made by you.
|
531
|
+
#
|
424
532
|
def delete
|
425
533
|
Rubbit_Poster.instance.delete(@name)
|
426
534
|
end
|
427
535
|
|
536
|
+
# ==== Description
|
537
|
+
#
|
538
|
+
# Modifies the text of this comment. Only works if the comment was made by you.
|
539
|
+
#
|
540
|
+
# ==== Attributes
|
541
|
+
#
|
542
|
+
# * +text+ - The new comment body.
|
543
|
+
#
|
428
544
|
def edit(text)
|
429
545
|
Rubbit_Poster.instance.edit(@name,text)
|
430
546
|
end
|
431
547
|
|
548
|
+
# ==== Description
|
549
|
+
#
|
550
|
+
# No longer shows the comment to you on Reddit.
|
551
|
+
#
|
432
552
|
def hide
|
433
553
|
Rubbit_Poster.instance.hide(@name)
|
434
554
|
end
|
435
555
|
end
|
436
556
|
|
557
|
+
# == Rubbit Object
|
558
|
+
#
|
559
|
+
# Object representing a Reddit Post
|
560
|
+
#
|
437
561
|
class Post
|
438
562
|
@comments = nil
|
439
563
|
def initialize(json)
|
@@ -446,10 +570,23 @@ class Post
|
|
446
570
|
end
|
447
571
|
end
|
448
572
|
end
|
573
|
+
|
574
|
+
# ==== Description
|
575
|
+
#
|
576
|
+
# Makes a reply to a post
|
577
|
+
#
|
578
|
+
# ==== Attributes
|
579
|
+
#
|
580
|
+
# * +text+ - The new comment body.
|
581
|
+
#
|
449
582
|
def reply(text)
|
450
583
|
return Rubbit_Poster.instance.comment(@name,text)
|
451
584
|
end
|
452
585
|
|
586
|
+
# ==== Description
|
587
|
+
#
|
588
|
+
# Retrieves the comments of a post in a list tree.
|
589
|
+
#
|
453
590
|
def replies
|
454
591
|
if(@comments==nil)
|
455
592
|
@comments = Rubbit_Object_Builder.instance.get_comments('http://www.reddit.com'+@permalink).children
|
@@ -457,23 +594,47 @@ class Post
|
|
457
594
|
return @comments
|
458
595
|
end
|
459
596
|
|
597
|
+
# ==== Description
|
598
|
+
#
|
599
|
+
# Deletes this post. Only works if you made the post.
|
600
|
+
#
|
460
601
|
def delete
|
461
602
|
Rubbit_Poster.instance.delete(@name)
|
462
603
|
end
|
463
604
|
|
605
|
+
# ==== Description
|
606
|
+
#
|
607
|
+
# Modifies the text of this post. Only works if the post was made by you and is a self post.
|
608
|
+
#
|
609
|
+
# ==== Attributes
|
610
|
+
#
|
611
|
+
# * +text+ - The new post body.
|
612
|
+
#
|
464
613
|
def edit(text)
|
465
614
|
Rubbit_Poster.instance.edit(@name,text)
|
466
615
|
end
|
467
616
|
|
617
|
+
# ==== Description
|
618
|
+
#
|
619
|
+
# Hides the post and no longer displays it when retrieving Reddit data
|
620
|
+
#
|
468
621
|
def hide
|
469
622
|
Rubbit_Poster.instance.hide(@name)
|
470
623
|
end
|
471
624
|
|
625
|
+
# ==== Description
|
626
|
+
#
|
627
|
+
# Marks a post as NSFW. Only works if you made the post or are a moderator of the subreddit it is in.
|
628
|
+
#
|
472
629
|
def mark_nsfw
|
473
630
|
Rubbit_Poster.instance.mark_nsfw(@name)
|
474
631
|
end
|
475
632
|
end
|
476
633
|
|
634
|
+
# == Rubbit Object
|
635
|
+
#
|
636
|
+
# Object that represents a Personal Message
|
637
|
+
#
|
477
638
|
class Message
|
478
639
|
def initialize(json)
|
479
640
|
if(json['kind']=='t4')
|
@@ -485,6 +646,14 @@ class Message
|
|
485
646
|
end
|
486
647
|
end
|
487
648
|
|
649
|
+
# ==== Description
|
650
|
+
#
|
651
|
+
# Responds to an inbox message.
|
652
|
+
#
|
653
|
+
# ==== Attributes
|
654
|
+
#
|
655
|
+
# * +text+ - The new message body.
|
656
|
+
#
|
488
657
|
def reply(text)
|
489
658
|
Rubbit_Poster.instance.comment(text,@name)
|
490
659
|
end
|
@@ -493,7 +662,8 @@ end
|
|
493
662
|
class Listing
|
494
663
|
@after = nil
|
495
664
|
def initialize(json)
|
496
|
-
if(json['kind']=='Listing')
|
665
|
+
if(json['kind']=='Listing' or json['kind']=='UserList')
|
666
|
+
@after = nil
|
497
667
|
data = json['data']
|
498
668
|
data.each_key do |k|
|
499
669
|
self.class.module_eval {attr_accessor(k)}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Rubbit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- /u/The1RGood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple Ruby-based Reddit API Wrapper
|
14
14
|
email: randy@kindofabigdeal.org
|