redd 0.7.8 → 0.7.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +34 -34
- data/.rspec +3 -3
- data/.rubocop.yml +5 -5
- data/.travis.yml +9 -9
- data/LICENSE.md +22 -22
- data/README.md +143 -143
- data/Rakefile +5 -5
- data/RedditKit.LICENSE.md +8 -8
- data/lib/redd.rb +50 -50
- data/lib/redd/access.rb +76 -76
- data/lib/redd/clients/base.rb +181 -181
- data/lib/redd/clients/base/account.rb +20 -20
- data/lib/redd/clients/base/identity.rb +22 -22
- data/lib/redd/clients/base/none.rb +27 -27
- data/lib/redd/clients/base/privatemessages.rb +33 -33
- data/lib/redd/clients/base/read.rb +113 -113
- data/lib/redd/clients/base/stream.rb +81 -81
- data/lib/redd/clients/base/submit.rb +19 -19
- data/lib/redd/clients/base/utilities.rb +104 -104
- data/lib/redd/clients/base/wikiread.rb +33 -33
- data/lib/redd/clients/installed.rb +56 -56
- data/lib/redd/clients/script.rb +41 -41
- data/lib/redd/clients/userless.rb +32 -32
- data/lib/redd/clients/web.rb +58 -58
- data/lib/redd/error.rb +151 -151
- data/lib/redd/objects/base.rb +39 -39
- data/lib/redd/objects/comment.rb +22 -22
- data/lib/redd/objects/labeled_multi.rb +13 -13
- data/lib/redd/objects/listing.rb +29 -29
- data/lib/redd/objects/more_comments.rb +11 -10
- data/lib/redd/objects/private_message.rb +28 -28
- data/lib/redd/objects/submission.rb +139 -139
- data/lib/redd/objects/subreddit.rb +330 -319
- data/lib/redd/objects/thing.rb +26 -26
- data/lib/redd/objects/thing/editable.rb +22 -22
- data/lib/redd/objects/thing/hideable.rb +18 -18
- data/lib/redd/objects/thing/inboxable.rb +25 -25
- data/lib/redd/objects/thing/messageable.rb +34 -34
- data/lib/redd/objects/thing/moderatable.rb +43 -43
- data/lib/redd/objects/thing/refreshable.rb +14 -14
- data/lib/redd/objects/thing/saveable.rb +21 -21
- data/lib/redd/objects/thing/votable.rb +33 -33
- data/lib/redd/objects/user.rb +52 -52
- data/lib/redd/objects/wiki_page.rb +15 -15
- data/lib/redd/rate_limit.rb +88 -88
- data/lib/redd/response/parse_json.rb +18 -18
- data/lib/redd/response/raise_error.rb +16 -16
- data/lib/redd/version.rb +4 -4
- data/redd.gemspec +31 -31
- data/spec/redd/objects/base_spec.rb +1 -1
- data/spec/redd/response/raise_error_spec.rb +11 -11
- data/spec/redd_spec.rb +5 -5
- data/spec/spec_helper.rb +71 -71
- metadata +21 -21
@@ -1,19 +1,19 @@
|
|
1
|
-
module Redd
|
2
|
-
module Clients
|
3
|
-
class Base
|
4
|
-
# Methods that require the "submit" scope
|
5
|
-
module Submit
|
6
|
-
# Add a comment to a link, reply to a comment or reply to a message.
|
7
|
-
# Bit of an all-purpose method, this one.
|
8
|
-
# @param thing [Objects::Submission, Objects::Comment,
|
9
|
-
# Objects::PrivateMessage] A thing to add a comment to.
|
10
|
-
# @param text [String] The text to comment.
|
11
|
-
# @return [Objects::Comment, Objects::PrivateMessage] The reply.
|
12
|
-
def add_comment(thing, text)
|
13
|
-
response = post("/api/comment", text: text, thing_id: thing.fullname)
|
14
|
-
object_from_body(response.body[:json][:data][:things][0])
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
1
|
+
module Redd
|
2
|
+
module Clients
|
3
|
+
class Base
|
4
|
+
# Methods that require the "submit" scope
|
5
|
+
module Submit
|
6
|
+
# Add a comment to a link, reply to a comment or reply to a message.
|
7
|
+
# Bit of an all-purpose method, this one.
|
8
|
+
# @param thing [Objects::Submission, Objects::Comment,
|
9
|
+
# Objects::PrivateMessage] A thing to add a comment to.
|
10
|
+
# @param text [String] The text to comment.
|
11
|
+
# @return [Objects::Comment, Objects::PrivateMessage] The reply.
|
12
|
+
def add_comment(thing, text)
|
13
|
+
response = post("/api/comment", text: text, thing_id: thing.fullname)
|
14
|
+
object_from_body(response.body[:json][:data][:things][0])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,104 +1,104 @@
|
|
1
|
-
require_relative "../../objects/base"
|
2
|
-
require_relative "../../objects/thing"
|
3
|
-
require_relative "../../objects/listing"
|
4
|
-
require_relative "../../objects/wiki_page"
|
5
|
-
require_relative "../../objects/labeled_multi"
|
6
|
-
require_relative "../../objects/more_comments"
|
7
|
-
require_relative "../../objects/comment"
|
8
|
-
require_relative "../../objects/user"
|
9
|
-
require_relative "../../objects/submission"
|
10
|
-
require_relative "../../objects/private_message"
|
11
|
-
require_relative "../../objects/subreddit"
|
12
|
-
|
13
|
-
module Redd
|
14
|
-
module Clients
|
15
|
-
class Base
|
16
|
-
# Internal methods that make life easier.
|
17
|
-
# @todo Move this out to Redd::Utils?
|
18
|
-
module Utilities
|
19
|
-
# The kind strings and the objects that should be used for them.
|
20
|
-
OBJECT_KINDS = {
|
21
|
-
"Listing" => Objects::Listing,
|
22
|
-
"wikipage" => Objects::WikiPage,
|
23
|
-
"LabeledMulti" => Objects::LabeledMulti,
|
24
|
-
"more" => Objects::MoreComments,
|
25
|
-
"t1" => Objects::Comment,
|
26
|
-
"t2" => Objects::User,
|
27
|
-
"t3" => Objects::Submission,
|
28
|
-
"t4" => Objects::PrivateMessage,
|
29
|
-
"t5" => Objects::Subreddit
|
30
|
-
}
|
31
|
-
|
32
|
-
# Request and create an object from the response.
|
33
|
-
# @param [Symbol] meth The method to use.
|
34
|
-
# @param [String] path The path to visit.
|
35
|
-
# @param [Hash] params The data to send with the request.
|
36
|
-
# @return [Objects::Base] The object returned from the request.
|
37
|
-
def request_object(meth, path, params = {})
|
38
|
-
body = send(meth, path, params).body
|
39
|
-
object_from_body(body)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Create an object instance with the correct attributes when given a
|
43
|
-
# body.
|
44
|
-
#
|
45
|
-
# @param [Hash] body A JSON hash.
|
46
|
-
# @return [Objects::Thing, Objects::Listing]
|
47
|
-
def object_from_body(body)
|
48
|
-
return nil unless body.is_a?(Hash)
|
49
|
-
object = object_from_kind(body[:kind])
|
50
|
-
flat = flatten_body(body)
|
51
|
-
object.new(self, flat)
|
52
|
-
end
|
53
|
-
|
54
|
-
# @param [Objects::Submission, Objects::Comment] base The start of the
|
55
|
-
# comment tree.
|
56
|
-
# @author Bryce Boe (@bboe) in Python
|
57
|
-
# @return [Array<Objects::Comment, Objects::MoreComments>] A linear
|
58
|
-
# array of the submission's comments or the comments' replies.
|
59
|
-
def flat_comments(base)
|
60
|
-
meth = (base.is_a?(Objects::Submission) ? :comments : :replies)
|
61
|
-
stack = base.send(meth).dup
|
62
|
-
flattened = []
|
63
|
-
|
64
|
-
until stack.empty?
|
65
|
-
comment = stack.shift
|
66
|
-
if comment.is_a?(Objects::Comment)
|
67
|
-
replies = comment.replies
|
68
|
-
stack = replies + stack if replies
|
69
|
-
end
|
70
|
-
flattened << comment
|
71
|
-
end
|
72
|
-
|
73
|
-
flattened
|
74
|
-
end
|
75
|
-
|
76
|
-
# Get a given property of a given object.
|
77
|
-
# @param [Objects::Base, String] object The object with the property.
|
78
|
-
# @param [Symbol] property The property to get.
|
79
|
-
def property(object, property)
|
80
|
-
object.respond_to?(property) ? object.send(property) : object.to_s
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
|
85
|
-
# Take a multilevel body ({kind: "tx", data: {...}}) and flatten it
|
86
|
-
# into something like {kind: "tx", ...}
|
87
|
-
# @param [Hash] body The response body.
|
88
|
-
# @return [Hash] The flattened hash.
|
89
|
-
def flatten_body(body)
|
90
|
-
data = body[:data] || body
|
91
|
-
data[:kind] = body[:kind]
|
92
|
-
data
|
93
|
-
end
|
94
|
-
|
95
|
-
# @param [String] kind A kind in the format /t[1-5]/.
|
96
|
-
# @return [Objects::Base, Objects::Listing] The appropriate object for
|
97
|
-
# a given kind.
|
98
|
-
def object_from_kind(kind)
|
99
|
-
OBJECT_KINDS.fetch(kind, Objects::Base)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
1
|
+
require_relative "../../objects/base"
|
2
|
+
require_relative "../../objects/thing"
|
3
|
+
require_relative "../../objects/listing"
|
4
|
+
require_relative "../../objects/wiki_page"
|
5
|
+
require_relative "../../objects/labeled_multi"
|
6
|
+
require_relative "../../objects/more_comments"
|
7
|
+
require_relative "../../objects/comment"
|
8
|
+
require_relative "../../objects/user"
|
9
|
+
require_relative "../../objects/submission"
|
10
|
+
require_relative "../../objects/private_message"
|
11
|
+
require_relative "../../objects/subreddit"
|
12
|
+
|
13
|
+
module Redd
|
14
|
+
module Clients
|
15
|
+
class Base
|
16
|
+
# Internal methods that make life easier.
|
17
|
+
# @todo Move this out to Redd::Utils?
|
18
|
+
module Utilities
|
19
|
+
# The kind strings and the objects that should be used for them.
|
20
|
+
OBJECT_KINDS = {
|
21
|
+
"Listing" => Objects::Listing,
|
22
|
+
"wikipage" => Objects::WikiPage,
|
23
|
+
"LabeledMulti" => Objects::LabeledMulti,
|
24
|
+
"more" => Objects::MoreComments,
|
25
|
+
"t1" => Objects::Comment,
|
26
|
+
"t2" => Objects::User,
|
27
|
+
"t3" => Objects::Submission,
|
28
|
+
"t4" => Objects::PrivateMessage,
|
29
|
+
"t5" => Objects::Subreddit
|
30
|
+
}
|
31
|
+
|
32
|
+
# Request and create an object from the response.
|
33
|
+
# @param [Symbol] meth The method to use.
|
34
|
+
# @param [String] path The path to visit.
|
35
|
+
# @param [Hash] params The data to send with the request.
|
36
|
+
# @return [Objects::Base] The object returned from the request.
|
37
|
+
def request_object(meth, path, params = {})
|
38
|
+
body = send(meth, path, params).body
|
39
|
+
object_from_body(body)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Create an object instance with the correct attributes when given a
|
43
|
+
# body.
|
44
|
+
#
|
45
|
+
# @param [Hash] body A JSON hash.
|
46
|
+
# @return [Objects::Thing, Objects::Listing]
|
47
|
+
def object_from_body(body)
|
48
|
+
return nil unless body.is_a?(Hash)
|
49
|
+
object = object_from_kind(body[:kind])
|
50
|
+
flat = flatten_body(body)
|
51
|
+
object.new(self, flat)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param [Objects::Submission, Objects::Comment] base The start of the
|
55
|
+
# comment tree.
|
56
|
+
# @author Bryce Boe (@bboe) in Python
|
57
|
+
# @return [Array<Objects::Comment, Objects::MoreComments>] A linear
|
58
|
+
# array of the submission's comments or the comments' replies.
|
59
|
+
def flat_comments(base)
|
60
|
+
meth = (base.is_a?(Objects::Submission) ? :comments : :replies)
|
61
|
+
stack = base.send(meth).dup
|
62
|
+
flattened = []
|
63
|
+
|
64
|
+
until stack.empty?
|
65
|
+
comment = stack.shift
|
66
|
+
if comment.is_a?(Objects::Comment)
|
67
|
+
replies = comment.replies
|
68
|
+
stack = replies + stack if replies
|
69
|
+
end
|
70
|
+
flattened << comment
|
71
|
+
end
|
72
|
+
|
73
|
+
flattened
|
74
|
+
end
|
75
|
+
|
76
|
+
# Get a given property of a given object.
|
77
|
+
# @param [Objects::Base, String] object The object with the property.
|
78
|
+
# @param [Symbol] property The property to get.
|
79
|
+
def property(object, property)
|
80
|
+
object.respond_to?(property) ? object.send(property) : object.to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# Take a multilevel body ({kind: "tx", data: {...}}) and flatten it
|
86
|
+
# into something like {kind: "tx", ...}
|
87
|
+
# @param [Hash] body The response body.
|
88
|
+
# @return [Hash] The flattened hash.
|
89
|
+
def flatten_body(body)
|
90
|
+
data = body[:data] || body
|
91
|
+
data[:kind] = body[:kind]
|
92
|
+
data
|
93
|
+
end
|
94
|
+
|
95
|
+
# @param [String] kind A kind in the format /t[1-5]/.
|
96
|
+
# @return [Objects::Base, Objects::Listing] The appropriate object for
|
97
|
+
# a given kind.
|
98
|
+
def object_from_kind(kind)
|
99
|
+
OBJECT_KINDS.fetch(kind, Objects::Base)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -1,33 +1,33 @@
|
|
1
|
-
module Redd
|
2
|
-
module Clients
|
3
|
-
class Base
|
4
|
-
# Methods that require the "wikiread" scope.
|
5
|
-
# @note This method is not limited to {Objects::Subreddit} because there
|
6
|
-
# are also top-level wiki pages.
|
7
|
-
module Wikiread
|
8
|
-
# Get a list of pages in the subreddit wiki.
|
9
|
-
# @param subreddit [Objects::Subreddit, String] The subreddit to
|
10
|
-
# look in.
|
11
|
-
# @return [Array<String>] An array of wikipage titles.
|
12
|
-
def get_wikipages(subreddit = nil)
|
13
|
-
path = "/wiki/pages.json"
|
14
|
-
name = property(subreddit, :display_name)
|
15
|
-
path.prepend("/r/#{name}") if subreddit
|
16
|
-
get(path).body[:data]
|
17
|
-
end
|
18
|
-
|
19
|
-
# Get a wiki page.
|
20
|
-
# @param page [String] The title of the wiki page.
|
21
|
-
# @param subreddit [Objects::Subreddit, String] The subreddit to
|
22
|
-
# look in.
|
23
|
-
# @return [Objects::WikiPage] A wiki page.
|
24
|
-
def wikipage(page, subreddit = nil)
|
25
|
-
path = "/wiki/#{page}.json"
|
26
|
-
name = property(subreddit, :display_name)
|
27
|
-
path.prepend("/r/#{name}") if subreddit
|
28
|
-
request_object(:get, path)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
1
|
+
module Redd
|
2
|
+
module Clients
|
3
|
+
class Base
|
4
|
+
# Methods that require the "wikiread" scope.
|
5
|
+
# @note This method is not limited to {Objects::Subreddit} because there
|
6
|
+
# are also top-level wiki pages.
|
7
|
+
module Wikiread
|
8
|
+
# Get a list of pages in the subreddit wiki.
|
9
|
+
# @param subreddit [Objects::Subreddit, String] The subreddit to
|
10
|
+
# look in.
|
11
|
+
# @return [Array<String>] An array of wikipage titles.
|
12
|
+
def get_wikipages(subreddit = nil)
|
13
|
+
path = "/wiki/pages.json"
|
14
|
+
name = property(subreddit, :display_name)
|
15
|
+
path.prepend("/r/#{name}") if subreddit
|
16
|
+
get(path).body[:data]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get a wiki page.
|
20
|
+
# @param page [String] The title of the wiki page.
|
21
|
+
# @param subreddit [Objects::Subreddit, String] The subreddit to
|
22
|
+
# look in.
|
23
|
+
# @return [Objects::WikiPage] A wiki page.
|
24
|
+
def wikipage(page, subreddit = nil)
|
25
|
+
path = "/wiki/#{page}.json"
|
26
|
+
name = property(subreddit, :display_name)
|
27
|
+
path.prepend("/r/#{name}") if subreddit
|
28
|
+
request_object(:get, path)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,56 +1,56 @@
|
|
1
|
-
require "cgi"
|
2
|
-
require_relative "base"
|
3
|
-
|
4
|
-
module Redd
|
5
|
-
module Clients
|
6
|
-
# The client for installed apps that can't keep a secret.
|
7
|
-
# It might even work with Rubymotion (fingers crossed).
|
8
|
-
class Installed < Base
|
9
|
-
# @!attribute [r] client_id
|
10
|
-
attr_reader :client_id
|
11
|
-
|
12
|
-
# @!attribute [r] redirect_uri
|
13
|
-
attr_reader :redirect_uri
|
14
|
-
|
15
|
-
# @param [Hash] options The options to create the client with.
|
16
|
-
# @see Base#initialize
|
17
|
-
# @see Redd.it
|
18
|
-
def initialize(client_id, redirect_uri, **options)
|
19
|
-
@client_id = client_id
|
20
|
-
@redirect_uri = redirect_uri
|
21
|
-
super(**options)
|
22
|
-
end
|
23
|
-
|
24
|
-
# @param [String] state A random string to double-check later.
|
25
|
-
# @param [Array<String>] scope The scope to request access to.
|
26
|
-
# @param [:temporary, :permanent] duration
|
27
|
-
# @return [String] The url to redirect the user to.
|
28
|
-
def auth_url(state, scope = ["identity"], duration = :temporary)
|
29
|
-
query = {
|
30
|
-
response_type: "token",
|
31
|
-
client_id: @client_id,
|
32
|
-
redirect_uri: @redirect_uri,
|
33
|
-
state: state,
|
34
|
-
scope: scope.join(","),
|
35
|
-
duration: duration
|
36
|
-
}
|
37
|
-
|
38
|
-
url = URI.join(auth_endpoint, "/api/v1/authorize")
|
39
|
-
url.query = URI.encode_www_form(query)
|
40
|
-
url.to_s
|
41
|
-
end
|
42
|
-
|
43
|
-
# Authorize using the url fragment.
|
44
|
-
# @param [String] fragment The part of the url after the "#".
|
45
|
-
# @return [Access] The access given by reddit.
|
46
|
-
def authorize!(fragment)
|
47
|
-
parsed = CGI.parse(fragment)
|
48
|
-
@access = Access.new(
|
49
|
-
access_token: parsed[:access_token].first,
|
50
|
-
expires_in: parsed[:expires_in].first,
|
51
|
-
scope: parsed[:scope]
|
52
|
-
)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
1
|
+
require "cgi"
|
2
|
+
require_relative "base"
|
3
|
+
|
4
|
+
module Redd
|
5
|
+
module Clients
|
6
|
+
# The client for installed apps that can't keep a secret.
|
7
|
+
# It might even work with Rubymotion (fingers crossed).
|
8
|
+
class Installed < Base
|
9
|
+
# @!attribute [r] client_id
|
10
|
+
attr_reader :client_id
|
11
|
+
|
12
|
+
# @!attribute [r] redirect_uri
|
13
|
+
attr_reader :redirect_uri
|
14
|
+
|
15
|
+
# @param [Hash] options The options to create the client with.
|
16
|
+
# @see Base#initialize
|
17
|
+
# @see Redd.it
|
18
|
+
def initialize(client_id, redirect_uri, **options)
|
19
|
+
@client_id = client_id
|
20
|
+
@redirect_uri = redirect_uri
|
21
|
+
super(**options)
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [String] state A random string to double-check later.
|
25
|
+
# @param [Array<String>] scope The scope to request access to.
|
26
|
+
# @param [:temporary, :permanent] duration
|
27
|
+
# @return [String] The url to redirect the user to.
|
28
|
+
def auth_url(state, scope = ["identity"], duration = :temporary)
|
29
|
+
query = {
|
30
|
+
response_type: "token",
|
31
|
+
client_id: @client_id,
|
32
|
+
redirect_uri: @redirect_uri,
|
33
|
+
state: state,
|
34
|
+
scope: scope.join(","),
|
35
|
+
duration: duration
|
36
|
+
}
|
37
|
+
|
38
|
+
url = URI.join(auth_endpoint, "/api/v1/authorize")
|
39
|
+
url.query = URI.encode_www_form(query)
|
40
|
+
url.to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
# Authorize using the url fragment.
|
44
|
+
# @param [String] fragment The part of the url after the "#".
|
45
|
+
# @return [Access] The access given by reddit.
|
46
|
+
def authorize!(fragment)
|
47
|
+
parsed = CGI.parse(fragment)
|
48
|
+
@access = Access.new(
|
49
|
+
access_token: parsed[:access_token].first,
|
50
|
+
expires_in: parsed[:expires_in].first,
|
51
|
+
scope: parsed[:scope]
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/redd/clients/script.rb
CHANGED
@@ -1,41 +1,41 @@
|
|
1
|
-
require_relative "base"
|
2
|
-
|
3
|
-
module Redd
|
4
|
-
module Clients
|
5
|
-
# The client for an account you own (e.g. bots).
|
6
|
-
class Script < Base
|
7
|
-
# @!attribute [r] client_id
|
8
|
-
attr_reader :client_id
|
9
|
-
|
10
|
-
# @!attribute [r] username
|
11
|
-
attr_reader :username
|
12
|
-
|
13
|
-
# @param [Hash] options The options to create the client with.
|
14
|
-
# @see Base#initialize
|
15
|
-
# @see Redd.it
|
16
|
-
def initialize(client_id, secret, username, password, **options)
|
17
|
-
@client_id = client_id
|
18
|
-
@secret = secret
|
19
|
-
@username = username
|
20
|
-
@password = password
|
21
|
-
super(**options)
|
22
|
-
end
|
23
|
-
|
24
|
-
# Authorize using the given data.
|
25
|
-
# @return [Access] The access given by reddit.
|
26
|
-
def authorize!
|
27
|
-
response = auth_connection.post(
|
28
|
-
"/api/v1/access_token",
|
29
|
-
grant_type: "password",
|
30
|
-
username: @username,
|
31
|
-
password: @password
|
32
|
-
)
|
33
|
-
|
34
|
-
@access = Access.new(response.body)
|
35
|
-
end
|
36
|
-
|
37
|
-
alias_method :refresh_access!, :authorize!
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Redd
|
4
|
+
module Clients
|
5
|
+
# The client for an account you own (e.g. bots).
|
6
|
+
class Script < Base
|
7
|
+
# @!attribute [r] client_id
|
8
|
+
attr_reader :client_id
|
9
|
+
|
10
|
+
# @!attribute [r] username
|
11
|
+
attr_reader :username
|
12
|
+
|
13
|
+
# @param [Hash] options The options to create the client with.
|
14
|
+
# @see Base#initialize
|
15
|
+
# @see Redd.it
|
16
|
+
def initialize(client_id, secret, username, password, **options)
|
17
|
+
@client_id = client_id
|
18
|
+
@secret = secret
|
19
|
+
@username = username
|
20
|
+
@password = password
|
21
|
+
super(**options)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Authorize using the given data.
|
25
|
+
# @return [Access] The access given by reddit.
|
26
|
+
def authorize!
|
27
|
+
response = auth_connection.post(
|
28
|
+
"/api/v1/access_token",
|
29
|
+
grant_type: "password",
|
30
|
+
username: @username,
|
31
|
+
password: @password
|
32
|
+
)
|
33
|
+
|
34
|
+
@access = Access.new(response.body)
|
35
|
+
end
|
36
|
+
|
37
|
+
alias_method :refresh_access!, :authorize!
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|