Rubbit 0.0.1
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 +15 -0
- data/lib/Rubbit.rb +144 -0
- data/lib/Rubbit/Reddit_Net_Wrapper.rb +111 -0
- data/lib/Rubbit/Rubbit_Construction_Layer.rb +179 -0
- data/lib/Rubbit/Rubbit_Objects.rb +229 -0
- metadata +47 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
ZjlkZjMyNGY1NWI4ZmU5NzQyYjlkMzI1ODU1NTdkZjA0MzgzMDI2OA==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
YmE4NDVjYjEyM2QyNzJlYTliN2ZmYzZkMjQzMWRlZWQxZTZkNTA2NQ==
|
|
7
|
+
SHA512:
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
Nzc4NTQwYTI3NGEyNWFlZDhmM2YxYjk0MzdjZTI5NzljZjQzMmRjMTI0ZDJl
|
|
10
|
+
MGU0YTkzYjdlNzM2YTM1NzFhY2ZlYzVmZDM3ZDU4M2U5ZWU3NTM3ZWRjYTU4
|
|
11
|
+
NzRjNTliZjlkYjI2N2ZkNDZmMjQ0YWZlZGU5OTA3MTAyMTVkNTA=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
OGFlNjdkZDNkMGE1YmJhZjc4ZGQ5NWVlMjZjZjgyYjk2Y2I0NWM0ZmUxZjJh
|
|
14
|
+
OWJjYjlkMzA5YTI3MzY0OTgzMGFiZjA4NTdjZWRiYjNkOGZiOGQ0ZDhkMGMw
|
|
15
|
+
NWE4ZjExOTYyMjIyYzg0ZTAzZmIwNDJiZDBkMTFjMTRlMjgwZjk=
|
data/lib/Rubbit.rb
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
require 'Rubbit/Rubbit_Objects'
|
|
2
|
+
require 'Rubbit/Rubbit_Construction_Layer'
|
|
3
|
+
require 'io/console'
|
|
4
|
+
|
|
5
|
+
class Rubbit
|
|
6
|
+
attr_accessor :client_name, :object_builder, :rubbit_poster, :me
|
|
7
|
+
|
|
8
|
+
def initialize(name)
|
|
9
|
+
@client_name = name
|
|
10
|
+
@object_builder = Rubbit_Object_Builder.instance(name)
|
|
11
|
+
@rubbit_poster = Rubbit_Poster.instance(name)
|
|
12
|
+
@me = nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def get_subreddit(display_name)
|
|
16
|
+
return @object_builder.build_subreddit(display_name)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def get_redditor(user)
|
|
20
|
+
return @object_builder.build_user(user)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def login(user=nil,passwd=nil)
|
|
24
|
+
if(user==nil)
|
|
25
|
+
print('Enter username: ')
|
|
26
|
+
user = gets.chomp
|
|
27
|
+
print('Enter password for '+user.to_s+': ')
|
|
28
|
+
passwd = STDIN.noecho(&:gets).chomp
|
|
29
|
+
elsif(passwd==nil)
|
|
30
|
+
print('Enter password for '+user.to_s+': ')
|
|
31
|
+
passwd = STDIN.noecho(&:gets).chomp
|
|
32
|
+
end
|
|
33
|
+
@me = @rubbit_poster.login(user,passwd)
|
|
34
|
+
return @me
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def clear_session(curpass=nil,uh=nil)
|
|
38
|
+
if(@me==nil)
|
|
39
|
+
print('Not logged in. No session to clear')
|
|
40
|
+
elsif(curpass==nil)
|
|
41
|
+
print('Enter password for '+user.to_s+': ')
|
|
42
|
+
passwd = STDIN.noecho(&:gets).chomp
|
|
43
|
+
end
|
|
44
|
+
return @rubbit_poster.clear_sessions(curpass,uh)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def delete_user(user=nil,passwd=nil,message="",uh=nil)
|
|
48
|
+
confirm = nil
|
|
49
|
+
if(user==nil)
|
|
50
|
+
print('Enter username: ')
|
|
51
|
+
user = gets.chomp
|
|
52
|
+
print('Enter password for '+user.to_s+': ')
|
|
53
|
+
passwd = STDIN.noecho(&:gets).chomp
|
|
54
|
+
elsif(passwd==nil)
|
|
55
|
+
print('Enter password for '+user.to_s+': ')
|
|
56
|
+
passwd = STDIN.noecho(&:gets).chomp
|
|
57
|
+
end
|
|
58
|
+
while(confirm==nil)
|
|
59
|
+
print('Confirm deletion of '+user.to_s+' (y/n): ')
|
|
60
|
+
answer = gets.chomp
|
|
61
|
+
if(answer=='y')
|
|
62
|
+
confirm = true
|
|
63
|
+
elsif(answer=='n')
|
|
64
|
+
confirm = false
|
|
65
|
+
else
|
|
66
|
+
puts("Invalid input.")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
return @rubbit_poster.delete_user(user,passwd,confirm,message,@me.uh)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def get_me()
|
|
74
|
+
return @object_builder.build_user(@me.name)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def update(curpass=nil,email=nil,newpass=nil,verify=nil,verpass=nil)
|
|
78
|
+
if(@me==nil)
|
|
79
|
+
print('Not logged in. Cannot update password or email')
|
|
80
|
+
return false
|
|
81
|
+
else
|
|
82
|
+
if(curpass == nil)
|
|
83
|
+
print('Enter password for '+@me.name.to_s+': ')
|
|
84
|
+
curpass = STDIN.noecho(&:gets).chomp
|
|
85
|
+
end
|
|
86
|
+
if(email == nil)
|
|
87
|
+
print('Enter new email: ')
|
|
88
|
+
email = gets.chomp
|
|
89
|
+
end
|
|
90
|
+
if(newpass == nil)
|
|
91
|
+
print('Enter new password for '+@me.name.to_s+': ')
|
|
92
|
+
newpass = STDIN.noecho(&:gets).chomp
|
|
93
|
+
end
|
|
94
|
+
if(verify == nil)
|
|
95
|
+
while(verify==nil)
|
|
96
|
+
print('Are you sure? (y/n): ')
|
|
97
|
+
input = gets.chomp
|
|
98
|
+
if(input=='y')
|
|
99
|
+
verify=true
|
|
100
|
+
elsif(input=='n')
|
|
101
|
+
verify= false
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
if(verpass==nil)
|
|
106
|
+
print('Verify password for '+@me.name.to_s+': ')
|
|
107
|
+
verpass = STDIN.noecho(&:gets).chomp
|
|
108
|
+
end
|
|
109
|
+
return @rubbit_poster.update(curpass,email,newpass,verify,verpass)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def get_submission(link)
|
|
114
|
+
return @object_builder.build_submission(link)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def get_inbox(limit=100)
|
|
118
|
+
if(me!=nil)
|
|
119
|
+
return ContentGenerator.new('http://www.reddit.com/message/inbox.json',limit)
|
|
120
|
+
end
|
|
121
|
+
return nil
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def get_unread(limit=100)
|
|
125
|
+
if(me!=nil)
|
|
126
|
+
return ContentGenerator.new('http://www.reddit.com/message/unread.json',limit)
|
|
127
|
+
end
|
|
128
|
+
return nil
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def get_sent(limit=100)
|
|
132
|
+
if(me!=nil)
|
|
133
|
+
return ContentGenerator.new('http://www.reddit.com/message/sent.json',limit)
|
|
134
|
+
end
|
|
135
|
+
return nil
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def submit(sr,title,url=nil,text=nil,kind='self',resubmit=false,save=false,sendreplies=true)
|
|
139
|
+
if(@me!=nil)
|
|
140
|
+
return @rubbit_poster.submit(sr,title,url,text,kind,resubmit,save,sendreplies)
|
|
141
|
+
end
|
|
142
|
+
return nil
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'uri'
|
|
3
|
+
require 'time'
|
|
4
|
+
require 'json'
|
|
5
|
+
|
|
6
|
+
class Reddit_Net_Wrapper
|
|
7
|
+
@used = nil
|
|
8
|
+
@remaining = nil
|
|
9
|
+
@reset = nil
|
|
10
|
+
@first_request = nil
|
|
11
|
+
@user_agent = nil
|
|
12
|
+
|
|
13
|
+
@cookie = nil
|
|
14
|
+
|
|
15
|
+
@@instance = nil
|
|
16
|
+
|
|
17
|
+
def self.instance(name=nil)
|
|
18
|
+
if(@@instance==nil)
|
|
19
|
+
if(name!=nil)
|
|
20
|
+
@@instance = new(name)
|
|
21
|
+
else
|
|
22
|
+
return nil
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
return @@instance
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def initialize(user)
|
|
29
|
+
@used = 0
|
|
30
|
+
@remaining = 30
|
|
31
|
+
@reset = 60
|
|
32
|
+
@first_request = 0
|
|
33
|
+
@user_agent = 'Rubbit/1.0 Ruby RAW by The1RGood USED BY: '
|
|
34
|
+
@user_agent+=user
|
|
35
|
+
|
|
36
|
+
@cookie = ""
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def make_request(request_type,url,params,redirect=false)
|
|
40
|
+
uri = URI(url)
|
|
41
|
+
|
|
42
|
+
if(@remaining==0)
|
|
43
|
+
while((Time.now-@first_request).to_i < 60)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
if((Time.now - @first_request).to_i > 60)
|
|
48
|
+
@used = 0
|
|
49
|
+
@remaining = 30
|
|
50
|
+
@reset = 60
|
|
51
|
+
@first_request = Time.now
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if(redirect==false)
|
|
55
|
+
@used += 1
|
|
56
|
+
@remaining -= 1
|
|
57
|
+
@reset = (Time.now - @first_request).to_i
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
puts url
|
|
61
|
+
|
|
62
|
+
case request_type.downcase
|
|
63
|
+
when 'post'
|
|
64
|
+
req = Net::HTTP::Post.new uri.request_uri
|
|
65
|
+
req['X-Ratelimit-Used'] = @used
|
|
66
|
+
req['X-Ratelimit-Remaining'] = @remaining
|
|
67
|
+
req['x-Ratelimit-Reset'] = @reset
|
|
68
|
+
|
|
69
|
+
req['Cookie']=@cookie
|
|
70
|
+
|
|
71
|
+
req.set_form_data(params)
|
|
72
|
+
|
|
73
|
+
res = Net::HTTP.start(uri.hostname, uri.port){|http|
|
|
74
|
+
http.request(req)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if(res.code=='302' or res.code=='301')
|
|
78
|
+
res = make_request(request_type,res['location'],params,true)
|
|
79
|
+
elsif(res['set-cookie']!=nil)
|
|
80
|
+
@cookie = res['set-cookie']
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
return res
|
|
84
|
+
when 'get'
|
|
85
|
+
req = Net::HTTP::Get.new uri.request_uri
|
|
86
|
+
req['X-Ratelimit-Used'] = @used
|
|
87
|
+
req['X-Ratelimit-Remaining'] = @remaining
|
|
88
|
+
req['x-Ratelimit-Reset'] = @reset
|
|
89
|
+
|
|
90
|
+
req['Cookie']=@cookie
|
|
91
|
+
|
|
92
|
+
res = Net::HTTP.start(uri.hostname, uri.port){|http|
|
|
93
|
+
http.request(req)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if(res.code=='302' or res.code=='301')
|
|
97
|
+
res = make_request(request_type,res['location'],true)
|
|
98
|
+
elsif(res['set-cookie']!=nil)
|
|
99
|
+
@cookie=res['set-cookie']
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
return res
|
|
103
|
+
when 'delete'
|
|
104
|
+
puts 'delete placeholder'
|
|
105
|
+
else
|
|
106
|
+
puts 'Bad Request Type'
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
private_class_method :new
|
|
111
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
require 'Rubbit/Rubbit_Objects'
|
|
2
|
+
require 'Rubbit/Reddit_Net_Wrapper'
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
class Rubbit_Object_Builder
|
|
6
|
+
|
|
7
|
+
@@instance = nil
|
|
8
|
+
|
|
9
|
+
def self.instance(name=nil)
|
|
10
|
+
if(@@instance==nil)
|
|
11
|
+
if(name!=nil)
|
|
12
|
+
@@instance = new(name)
|
|
13
|
+
else
|
|
14
|
+
return nil
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
return @@instance
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize(net_name)
|
|
21
|
+
Reddit_Net_Wrapper.instance(net_name)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def build_subreddit(display_name)
|
|
25
|
+
response = Reddit_Net_Wrapper.instance.make_request('get','http://www.reddit.com/r/'+display_name.to_s+"/about.json",{})
|
|
26
|
+
puts response.code
|
|
27
|
+
if(response.code=='200')
|
|
28
|
+
return Subreddit.new(JSON.parse(response.body))
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def build_user(user)
|
|
33
|
+
response = Reddit_Net_Wrapper.instance.make_request('get','http://www.reddit.com/user/'+user.to_s+'/about.json',{})
|
|
34
|
+
if(response.code=='200')
|
|
35
|
+
return Redditor.new(JSON.parse(response.body))
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def build_listing(link)
|
|
40
|
+
response = Reddit_Net_Wrapper.instance.make_request('get',link,{})
|
|
41
|
+
if(response.code=='200')
|
|
42
|
+
return Listing.new(JSON.parse(response.body,:max_nesting => 100))
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def build_submission(link)
|
|
47
|
+
response = Reddit_Net_Wrapper.instance.make_request('get',link.to_s+".json",{})
|
|
48
|
+
if(response.code=='200')
|
|
49
|
+
json = JSON.parse(response.body)
|
|
50
|
+
if(json['kind']=='t1')
|
|
51
|
+
return Comment.new(json)
|
|
52
|
+
elsif(json['kind']=='t3')
|
|
53
|
+
return Post.new(json)
|
|
54
|
+
elsif(json['kind']=='t4')
|
|
55
|
+
return Message.new(json)
|
|
56
|
+
else
|
|
57
|
+
return nil
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private_class_method :new
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
class Rubbit_Poster
|
|
66
|
+
@@instance = nil
|
|
67
|
+
@logged_in_user = nil
|
|
68
|
+
|
|
69
|
+
def initialize(net_name)
|
|
70
|
+
Reddit_Net_Wrapper.instance(net_name)
|
|
71
|
+
@logged_in_user = nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def self.instance(name=nil)
|
|
75
|
+
if(@@instance==nil)
|
|
76
|
+
if(name!=nil)
|
|
77
|
+
@@instance = new(name)
|
|
78
|
+
else
|
|
79
|
+
return nil
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
return @@instance
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def login(user,passwd)
|
|
86
|
+
params = {}
|
|
87
|
+
params['op']='login'
|
|
88
|
+
params['user']=user
|
|
89
|
+
params['passwd']=passwd
|
|
90
|
+
params['api-type']='json'
|
|
91
|
+
|
|
92
|
+
login_status = Reddit_Net_Wrapper.instance.make_request('post','http://www.reddit.com/api/login/',params).code
|
|
93
|
+
|
|
94
|
+
if(login_status=='200')
|
|
95
|
+
user = Rubbit_Object_Builder.instance.build_user('the1rgood')
|
|
96
|
+
@logged_in_user = user.name
|
|
97
|
+
return user
|
|
98
|
+
end
|
|
99
|
+
return nil
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def clear_sessions(curpass)
|
|
103
|
+
params = {}
|
|
104
|
+
params['api_type']='json'
|
|
105
|
+
params['curpass'] = curpass
|
|
106
|
+
params['uh']=get_modhash
|
|
107
|
+
|
|
108
|
+
response = Reddit_Net_Wrapper.instance.make_request('post','http://www.reddit.com/api/clear_sessions/',params)
|
|
109
|
+
|
|
110
|
+
if(response.code=='200')
|
|
111
|
+
return true
|
|
112
|
+
end
|
|
113
|
+
return false
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def delete_user(user,passwd,message,confirm)
|
|
117
|
+
params = {}
|
|
118
|
+
params['api_type']='json'
|
|
119
|
+
params['user']=user
|
|
120
|
+
params['passwd']=passwd
|
|
121
|
+
params['message']=message
|
|
122
|
+
params['uh']=get_modhash
|
|
123
|
+
|
|
124
|
+
response = Reddit_Net_Wrapper.instance.make_request('post','http://www.reddit.com/api/delete_user/',params)
|
|
125
|
+
if(response.code=='200')
|
|
126
|
+
return true
|
|
127
|
+
end
|
|
128
|
+
return false
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def update(email,newpass,curpass,verify,verpass)
|
|
132
|
+
params = {}
|
|
133
|
+
params['api_type']='json'
|
|
134
|
+
params['curpass']=curpass
|
|
135
|
+
params['email']=email
|
|
136
|
+
params['newpass']=newpass
|
|
137
|
+
params['verify']=verify
|
|
138
|
+
params['verpass']=verpass
|
|
139
|
+
params['uh']=get_modhash
|
|
140
|
+
|
|
141
|
+
response = Reddit_Net_Wrapper.instance.make_request('post','http://www.reddit.com/api/update/',params)
|
|
142
|
+
if(response.code=='200')
|
|
143
|
+
return true
|
|
144
|
+
end
|
|
145
|
+
return false
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def submit(sr,title,url=nil,text=nil,kind='self',resubmit=false,save=false,sendreplies=true)
|
|
149
|
+
params = {}
|
|
150
|
+
params['api_type']='json'
|
|
151
|
+
params['captcha']=nil
|
|
152
|
+
params['extension']=nil
|
|
153
|
+
params['iden']=nil
|
|
154
|
+
params['kind']=kind
|
|
155
|
+
params['resubmit']=resubmit
|
|
156
|
+
params['save']=save
|
|
157
|
+
params['sendreplies']=sendreplies
|
|
158
|
+
params['sr']=sr
|
|
159
|
+
params['text']=text
|
|
160
|
+
params['title']=title
|
|
161
|
+
params['uh']=get_modhash
|
|
162
|
+
params['url']=url
|
|
163
|
+
|
|
164
|
+
puts params
|
|
165
|
+
|
|
166
|
+
response = Reddit_Net_Wrapper.instance.make_request('post','http://www.reddit.com/api/submit/',params)
|
|
167
|
+
return JSON.parse(response.body)
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def get_modhash
|
|
172
|
+
response = Reddit_Net_Wrapper.instance.make_request('get','http://www.reddit.com/user/'+@logged_in_user+'/about.json',{})
|
|
173
|
+
data = JSON.parse(response.body)
|
|
174
|
+
puts data
|
|
175
|
+
return data['data']['modhash']
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
private_class_method :new
|
|
179
|
+
end
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
require 'Rubbit/Reddit_Net_Wrapper'
|
|
2
|
+
|
|
3
|
+
class Subreddit
|
|
4
|
+
def initialize(json)
|
|
5
|
+
if(json['kind']=='t5')
|
|
6
|
+
data = json['data']
|
|
7
|
+
data.each_key do |k|
|
|
8
|
+
self.class.module_eval {attr_accessor(k)}
|
|
9
|
+
self.send("#{k}=",data[k])
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_new(limit=100)
|
|
15
|
+
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/new.json',limit)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def get_hot(limit=100)
|
|
19
|
+
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/hot.json',limit)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def get_top(limit=100)
|
|
23
|
+
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/top.json',limit)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def get_gilded(limit=100)
|
|
27
|
+
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/gilded.json',limit)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def get_rising(limit=100)
|
|
31
|
+
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/rising.json',limit)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def get_controversial(limit=100)
|
|
35
|
+
return ContentGenerator.new('http://www.reddit.com/r/'+@display_name.to_s+'/controversial.json',limit)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def submit(title,url=nil,text=nil,kind='text',resubmit=false,save=false,sendreplies=true)
|
|
39
|
+
return Rubbit_Poster.instance.submit(@display_name,title,url,text,kind,resubmit,save,sendreplies)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class Redditor
|
|
44
|
+
def initialize(json)
|
|
45
|
+
if(json['kind']=='t2')
|
|
46
|
+
data = json['data']
|
|
47
|
+
data.each_key do |k|
|
|
48
|
+
self.class.module_eval {attr_accessor(k)}
|
|
49
|
+
self.send("#{k}=",data[k])
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def get_overview(limit=100)
|
|
55
|
+
return ContentGenerator.new('http://www.reddit.com/user/'+@name.to_s+'/.json',limit)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def get_comments(limit=100)
|
|
59
|
+
return ContentGenerator.new('http://www.reddit.com/user/'+@name.to_s+'/comments.json',limit)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def get_submitted(limit=100)
|
|
63
|
+
return ContentGenerator.new('http://www.reddit.com/user/'+@name.to_s+'/submitted.json',limit)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
class ContentGenerator
|
|
68
|
+
include Enumerable
|
|
69
|
+
@limit = nil
|
|
70
|
+
@count = nil
|
|
71
|
+
@source = nil
|
|
72
|
+
@data = nil
|
|
73
|
+
@after = nil
|
|
74
|
+
def initialize(source,limit=100,after='')
|
|
75
|
+
@source = source
|
|
76
|
+
@limit = limit
|
|
77
|
+
@count = 0
|
|
78
|
+
@data = []
|
|
79
|
+
@after = after
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def each
|
|
83
|
+
index = 0
|
|
84
|
+
if(@limit!=nil)
|
|
85
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+'?limit='+[@limit-@count,100].min.to_s+"&after="+@after+"&count="+@count.to_s)
|
|
86
|
+
if(listing.children[listing.children.length-1]!=nil)
|
|
87
|
+
@after = listing.children[listing.children.length-1].name
|
|
88
|
+
else
|
|
89
|
+
@after = nil
|
|
90
|
+
end
|
|
91
|
+
if(@after == nil)
|
|
92
|
+
@data+=[]
|
|
93
|
+
else
|
|
94
|
+
@data += listing.children
|
|
95
|
+
@count += listing.children.length
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+'?limit='+100.to_s+"&after="+@after+"&count="+@count.to_s)
|
|
99
|
+
if(listing.children[listing.children.length-1]!=nil)
|
|
100
|
+
@after = listing.children[listing.children.length-1].name
|
|
101
|
+
else
|
|
102
|
+
@after = nil
|
|
103
|
+
end
|
|
104
|
+
if(@after == nil)
|
|
105
|
+
@data+=[]
|
|
106
|
+
else
|
|
107
|
+
@data += listing.children
|
|
108
|
+
@count+= listing.children.length
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
while(index<@data.length)
|
|
113
|
+
yield @data[index]
|
|
114
|
+
index+=1
|
|
115
|
+
if(index==@data.length)
|
|
116
|
+
if(@after==nil)
|
|
117
|
+
@after=''
|
|
118
|
+
end
|
|
119
|
+
if(@limit!=nil)
|
|
120
|
+
if(@limit-@count>0)
|
|
121
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+'?limit='+[@limit-@count,100].min.to_s+"&after="+@after+"&count="+@count.to_s)
|
|
122
|
+
if(listing.children[listing.children.length-1]!=nil)
|
|
123
|
+
@after = listing.children[listing.children.length-1].name
|
|
124
|
+
else
|
|
125
|
+
@after = nil
|
|
126
|
+
end
|
|
127
|
+
if(@after == nil)
|
|
128
|
+
@data+=[]
|
|
129
|
+
else
|
|
130
|
+
@data += listing.children
|
|
131
|
+
@count += listing.children.length
|
|
132
|
+
end
|
|
133
|
+
else
|
|
134
|
+
@data += []
|
|
135
|
+
end
|
|
136
|
+
else
|
|
137
|
+
listing = Rubbit_Object_Builder.instance.build_listing(@source+"?limit="+100.to_s+"&after="+@after+"&count="+@count.to_s)
|
|
138
|
+
puts(@source+"?limit="+100.to_s+"&after="+@after+"&count="+@count.to_s)
|
|
139
|
+
if(listing.children[listing.children.length-1]!=nil)
|
|
140
|
+
@after = listing.children[listing.children.length-1].name
|
|
141
|
+
else
|
|
142
|
+
@after = nil
|
|
143
|
+
end
|
|
144
|
+
if(@after == nil)
|
|
145
|
+
@data+=[]
|
|
146
|
+
else
|
|
147
|
+
@data += listing.children
|
|
148
|
+
@count += listing.children.length
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def [](i)
|
|
156
|
+
return @data[i]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def length
|
|
160
|
+
return @data.length
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
class Comment
|
|
165
|
+
def initialize(json)
|
|
166
|
+
if(json['kind']=='t1')
|
|
167
|
+
data = json['data']
|
|
168
|
+
data.each_key do |k|
|
|
169
|
+
self.class.module_eval {attr_accessor(k)}
|
|
170
|
+
self.send("#{k}=",data[k])
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
class Post
|
|
177
|
+
def initialize(json)
|
|
178
|
+
if(json['kind']=='t3')
|
|
179
|
+
data = json['data']
|
|
180
|
+
data.each_key do |k|
|
|
181
|
+
self.class.module_eval {attr_accessor(k)}
|
|
182
|
+
self.send("#{k}=",data[k])
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
class Message
|
|
189
|
+
def initialize(json)
|
|
190
|
+
if(json['kind']=='t4')
|
|
191
|
+
data = json['data']
|
|
192
|
+
data.each_key do |k|
|
|
193
|
+
self.class.module_eval {attr_accessor(k)}
|
|
194
|
+
self.send("#{k}=",data[k])
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
class Listing
|
|
201
|
+
@after = nil
|
|
202
|
+
def initialize(json)
|
|
203
|
+
if(json['kind']=='Listing')
|
|
204
|
+
data = json['data']
|
|
205
|
+
data.each_key do |k|
|
|
206
|
+
self.class.module_eval {attr_accessor(k)}
|
|
207
|
+
self.send("#{k}=",data[k])
|
|
208
|
+
end
|
|
209
|
+
children_objects = []
|
|
210
|
+
@children.each do |c|
|
|
211
|
+
case c['kind']
|
|
212
|
+
when 't1'
|
|
213
|
+
children_objects += [Comment.new(c)]
|
|
214
|
+
when 't2'
|
|
215
|
+
children_objects += [Redditor.new(c)]
|
|
216
|
+
when 't3'
|
|
217
|
+
children_objects += [Post.new(c)]
|
|
218
|
+
when 't4'
|
|
219
|
+
children_objects += [Message.new(c)]
|
|
220
|
+
when 't5'
|
|
221
|
+
children_objects += [Subreddit.new(c)]
|
|
222
|
+
when 'Listing'
|
|
223
|
+
children_objects += [Listing.new(c)]
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
@children = children_objects
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: Rubbit
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- /u/The1RGood
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-08-13 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: A simple Ruby-based Reddit API Wrapper
|
|
14
|
+
email: randy@kindofabigdeal.org
|
|
15
|
+
executables: []
|
|
16
|
+
extensions: []
|
|
17
|
+
extra_rdoc_files: []
|
|
18
|
+
files:
|
|
19
|
+
- lib/Rubbit.rb
|
|
20
|
+
- lib/Rubbit/Reddit_Net_Wrapper.rb
|
|
21
|
+
- lib/Rubbit/Rubbit_Construction_Layer.rb
|
|
22
|
+
- lib/Rubbit/Rubbit_Objects.rb
|
|
23
|
+
homepage: http://rubygems.org/gems/rubbit
|
|
24
|
+
licenses:
|
|
25
|
+
- GPL v3
|
|
26
|
+
metadata: {}
|
|
27
|
+
post_install_message:
|
|
28
|
+
rdoc_options: []
|
|
29
|
+
require_paths:
|
|
30
|
+
- lib
|
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
32
|
+
requirements:
|
|
33
|
+
- - ! '>='
|
|
34
|
+
- !ruby/object:Gem::Version
|
|
35
|
+
version: '0'
|
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ! '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
requirements: []
|
|
42
|
+
rubyforge_project:
|
|
43
|
+
rubygems_version: 2.2.2
|
|
44
|
+
signing_key:
|
|
45
|
+
specification_version: 4
|
|
46
|
+
summary: Ruby API Wrapper for Reddit
|
|
47
|
+
test_files: []
|