redd 0.6.5 → 0.7.0
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 +4 -4
- data/.gitignore +34 -33
- data/.rspec +3 -4
- data/.rubocop.yml +5 -5
- data/.travis.yml +9 -7
- data/{LICENSE.md → LICENSE.txt} +22 -22
- data/README.md +126 -241
- data/Rakefile +5 -6
- data/{RedditKit.LICENSE.md → RedditKit.LICENSE.txt} +13 -13
- data/lib/redd.rb +50 -4
- data/lib/redd/access.rb +76 -0
- data/lib/redd/clients/base.rb +178 -0
- data/lib/redd/clients/base/account.rb +20 -0
- data/lib/redd/clients/base/identity.rb +22 -0
- data/lib/redd/clients/base/none.rb +27 -0
- data/lib/redd/clients/base/privatemessages.rb +28 -0
- data/lib/redd/clients/base/read.rb +66 -0
- data/lib/redd/clients/base/stream.rb +74 -0
- data/lib/redd/clients/base/submit.rb +54 -0
- data/lib/redd/clients/base/utilities.rb +80 -0
- data/lib/redd/clients/base/wikiread.rb +33 -0
- data/lib/redd/clients/installed.rb +55 -0
- data/lib/redd/clients/script.rb +37 -0
- data/lib/redd/clients/userless.rb +31 -0
- data/lib/redd/clients/web.rb +57 -0
- data/lib/redd/error.rb +138 -153
- data/lib/redd/objects/base.rb +36 -0
- data/lib/redd/objects/comment.rb +22 -0
- data/lib/redd/objects/listing.rb +29 -0
- data/lib/redd/objects/more_comments.rb +10 -0
- data/lib/redd/objects/private_message.rb +18 -0
- data/lib/redd/objects/submission.rb +72 -0
- data/lib/redd/objects/subreddit.rb +152 -0
- data/lib/redd/objects/thing.rb +33 -0
- data/lib/redd/objects/thing/editable.rb +22 -0
- data/lib/redd/objects/thing/hideable.rb +18 -0
- data/lib/redd/objects/thing/inboxable.rb +25 -0
- data/lib/redd/objects/thing/messageable.rb +34 -0
- data/lib/redd/objects/thing/moderatable.rb +43 -0
- data/lib/redd/objects/thing/refreshable.rb +14 -0
- data/lib/redd/objects/thing/saveable.rb +21 -0
- data/lib/redd/objects/thing/votable.rb +33 -0
- data/lib/redd/objects/user.rb +52 -0
- data/lib/redd/objects/wiki_page.rb +15 -0
- data/lib/redd/rate_limit.rb +50 -49
- data/lib/redd/response/parse_json.rb +17 -33
- data/lib/redd/response/raise_error.rb +16 -25
- data/lib/redd/version.rb +4 -5
- data/redd.gemspec +30 -31
- data/spec/redd/objects/base_spec.rb +1 -0
- data/spec/redd/rate_limit_spec.rb +29 -29
- data/spec/redd/response/parse_json_spec.rb +12 -0
- data/spec/redd/response/raise_error_spec.rb +11 -0
- data/spec/redd_spec.rb +7 -5
- data/spec/spec_helper.rb +69 -50
- metadata +73 -136
- data/.yardopts +0 -1
- data/lib/redd/base.rb +0 -56
- data/lib/redd/client/authenticated.rb +0 -83
- data/lib/redd/client/authenticated/account.rb +0 -13
- data/lib/redd/client/authenticated/apps.rb +0 -13
- data/lib/redd/client/authenticated/flair.rb +0 -71
- data/lib/redd/client/authenticated/gold.rb +0 -13
- data/lib/redd/client/authenticated/links_comments.rb +0 -189
- data/lib/redd/client/authenticated/live.rb +0 -13
- data/lib/redd/client/authenticated/moderation.rb +0 -126
- data/lib/redd/client/authenticated/multis.rb +0 -9
- data/lib/redd/client/authenticated/private_messages.rb +0 -73
- data/lib/redd/client/authenticated/subreddits.rb +0 -172
- data/lib/redd/client/authenticated/users.rb +0 -9
- data/lib/redd/client/authenticated/wiki.rb +0 -9
- data/lib/redd/client/oauth2.rb +0 -71
- data/lib/redd/client/oauth2/authorization.rb +0 -108
- data/lib/redd/client/oauth2/identity.rb +0 -16
- data/lib/redd/client/oauth2_script.rb +0 -24
- data/lib/redd/client/oauth2_script/authorization.rb +0 -21
- data/lib/redd/client/unauthenticated.rb +0 -118
- data/lib/redd/client/unauthenticated/account.rb +0 -30
- data/lib/redd/client/unauthenticated/captcha.rb +0 -27
- data/lib/redd/client/unauthenticated/links_comments.rb +0 -60
- data/lib/redd/client/unauthenticated/listing.rb +0 -65
- data/lib/redd/client/unauthenticated/live.rb +0 -9
- data/lib/redd/client/unauthenticated/moderation.rb +0 -26
- data/lib/redd/client/unauthenticated/subreddits.rb +0 -49
- data/lib/redd/client/unauthenticated/users.rb +0 -67
- data/lib/redd/client/unauthenticated/utilities.rb +0 -109
- data/lib/redd/client/unauthenticated/wiki.rb +0 -33
- data/lib/redd/oauth2_access.rb +0 -70
- data/lib/redd/object/comment.rb +0 -74
- data/lib/redd/object/listing.rb +0 -29
- data/lib/redd/object/more_comments.rb +0 -14
- data/lib/redd/object/private_message.rb +0 -35
- data/lib/redd/object/submission.rb +0 -94
- data/lib/redd/object/subreddit.rb +0 -74
- data/lib/redd/object/user.rb +0 -34
- data/lib/redd/object/wiki_page.rb +0 -27
- data/lib/redd/thing.rb +0 -27
- data/lib/redd/thing/commentable.rb +0 -27
- data/lib/redd/thing/editable.rb +0 -16
- data/lib/redd/thing/hideable.rb +0 -16
- data/lib/redd/thing/inboxable.rb +0 -20
- data/lib/redd/thing/messageable.rb +0 -12
- data/lib/redd/thing/moderatable.rb +0 -32
- data/lib/redd/thing/reportable.rb +0 -12
- data/lib/redd/thing/saveable.rb +0 -16
- data/lib/redd/thing/voteable.rb +0 -22
- data/spec/README.md +0 -18
- data/spec/redd/base_spec.rb +0 -36
- data/spec/redd/client/authenticated/account_spec.rb +0 -5
- data/spec/redd/client/authenticated/apps_spec.rb +0 -2
- data/spec/redd/client/authenticated/flair_spec.rb +0 -26
- data/spec/redd/client/authenticated/gold_spec.rb +0 -2
- data/spec/redd/client/authenticated/links_comments_spec.rb +0 -231
- data/spec/redd/client/authenticated/live_spec.rb +0 -2
- data/spec/redd/client/unauthenticated/account_spec.rb +0 -15
- data/spec/redd/client/unauthenticated/captcha_spec.rb +0 -23
- data/spec/redd/client/unauthenticated/links_comments_spec.rb +0 -28
- data/spec/redd/client/unauthenticated/listing_spec.rb +0 -23
- data/spec/redd/client/unauthenticated/live_spec.rb +0 -2
- data/spec/redd/client/unauthenticated/moderation_spec.rb +0 -14
- data/spec/redd/client/unauthenticated/subreddits_spec.rb +0 -35
- data/spec/redd/client/unauthenticated/users_spec.rb +0 -34
- data/spec/redd/client/unauthenticated/wiki_spec.rb +0 -18
- data/spec/redd/oauth2_access_spec.rb +0 -83
- data/spec/redd/thing_spec.rb +0 -22
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
module Redd
|
|
2
|
-
module Client
|
|
3
|
-
class Authenticated
|
|
4
|
-
# Methods for sending and reading private messages
|
|
5
|
-
module PrivateMessages
|
|
6
|
-
# Block the sender of the message from sending any more.
|
|
7
|
-
#
|
|
8
|
-
# @param message [Redd::Object::PrivateMessage, String] The message
|
|
9
|
-
# whose sender to block.
|
|
10
|
-
def block_message(message)
|
|
11
|
-
fullname = extract_fullname(message)
|
|
12
|
-
post "/api/block", id: fullname
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Compose a message to a person or the moderators of a subreddit.
|
|
16
|
-
#
|
|
17
|
-
# @param to [Redd::Object::User, Redd::Object::Subreddit, String] The
|
|
18
|
-
# thing to send a message to.
|
|
19
|
-
# @param subject [String] The subject of the message.
|
|
20
|
-
# @param text [String] The message text.
|
|
21
|
-
# @param captcha [String] A possible captcha result to send if one
|
|
22
|
-
# is required.
|
|
23
|
-
# @param identifier [String] The identifier for the captcha if one
|
|
24
|
-
# is required.
|
|
25
|
-
def compose_message(to, subject, text, captcha = nil, identifier = nil)
|
|
26
|
-
params = {api_type: "json", subject: subject, text: text}
|
|
27
|
-
params << {captcha: captcha, iden: identifier} if captcha
|
|
28
|
-
params[:to] = extract_attribute(to, :name) ||
|
|
29
|
-
extract_attribute(to, :display_name)
|
|
30
|
-
|
|
31
|
-
post "/api/compose", params
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Mark a message as read.
|
|
35
|
-
#
|
|
36
|
-
# @param message [Redd::Object::PrivateMessage, String] The message
|
|
37
|
-
# to mark as read.
|
|
38
|
-
def mark_as_read(message)
|
|
39
|
-
fullname = extract_fullname(message)
|
|
40
|
-
post "/api/read_message", id: fullname
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Mark a message as unread.
|
|
44
|
-
#
|
|
45
|
-
# @param message [Redd::Object::PrivateMessage, String] The message
|
|
46
|
-
# to mark as unread.
|
|
47
|
-
def mark_as_unread(message)
|
|
48
|
-
fullname = extract_fullname(message)
|
|
49
|
-
post "/api/unread_message", id: fullname
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Return a list of a user's private messages.
|
|
53
|
-
#
|
|
54
|
-
# @param category [String] The category of messages to view.
|
|
55
|
-
# @param mark [Boolean] Whether to remove the orangered from the
|
|
56
|
-
# user's inbox.
|
|
57
|
-
# @param params [Hash] A list of params to send with the request.
|
|
58
|
-
# @option params [String] :after Return results after the given
|
|
59
|
-
# fullname.
|
|
60
|
-
# @option params [String] :before Return results before the given
|
|
61
|
-
# fullname.
|
|
62
|
-
# @option params [Integer] :count (0) The number of items already seen
|
|
63
|
-
# in the listing.
|
|
64
|
-
# @option params [1..100] :limit (25) The maximum number of things to
|
|
65
|
-
# return.
|
|
66
|
-
def messages(category = "inbox", mark = false, params = {})
|
|
67
|
-
params[:mark] = mark
|
|
68
|
-
object_from_response :get, "/message/#{category}.json", params
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
module Redd
|
|
2
|
-
module Client
|
|
3
|
-
class Authenticated
|
|
4
|
-
# Methods to interact with subreddits
|
|
5
|
-
module Subreddits
|
|
6
|
-
# Subscribe to a subreddit.
|
|
7
|
-
#
|
|
8
|
-
# @param subreddit [Redd::Object::Subreddit, String] The subreddit to
|
|
9
|
-
# subscribe to.
|
|
10
|
-
def subscribe(subreddit)
|
|
11
|
-
edit_subscription(:sub, subreddit)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Unsubscribe from a subreddit.
|
|
15
|
-
#
|
|
16
|
-
# @param subreddit [Redd::Object::Subreddit, String] The subreddit to
|
|
17
|
-
# unsubscribe from.
|
|
18
|
-
def unsubscribe(subreddit)
|
|
19
|
-
edit_subscription(:unsub, subreddit)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Get a listing of subreddits.
|
|
23
|
-
#
|
|
24
|
-
# @param where [:popular, :new, :subscriber, :contributor, :moderator]
|
|
25
|
-
# The order of subreddits to return.
|
|
26
|
-
# @param params [Hash] A list of params to send with the request.
|
|
27
|
-
# @option params [String] :after Return results after the given
|
|
28
|
-
# fullname.
|
|
29
|
-
# @option params [String] :before Return results before the given
|
|
30
|
-
# fullname.
|
|
31
|
-
# @option params [Integer] :count (0) The number of items already seen
|
|
32
|
-
# in the listing.
|
|
33
|
-
# @option params [1..100] :limit (25) The maximum number of things to
|
|
34
|
-
# return.
|
|
35
|
-
# @return [Redd::Object::Listing] A listing of subreddits.
|
|
36
|
-
def get_subreddits(where = :subscriber, params = {})
|
|
37
|
-
path =
|
|
38
|
-
if [:popular, :new].include?(where)
|
|
39
|
-
"/subreddits/#{where}.json"
|
|
40
|
-
elsif [:subscriber, :contributor, :moderator].include?(where)
|
|
41
|
-
"/subreddits/mine/#{where}.json"
|
|
42
|
-
end
|
|
43
|
-
object_from_response(:get, path, params)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Get users related to the subreddit.
|
|
47
|
-
#
|
|
48
|
-
# @param where [:banned, :wikibanned, :contributors, :wikicontributors,
|
|
49
|
-
# :moderators] The order of users to return.
|
|
50
|
-
# @param subreddit [Redd::Object::Subreddit, String] The subreddit.
|
|
51
|
-
# The order of subreddits to return.
|
|
52
|
-
# @param params [Hash] A list of params to send with the request.
|
|
53
|
-
# @option params [String] :after Return results after the given
|
|
54
|
-
# fullname.
|
|
55
|
-
# @option params [String] :before Return results before the given
|
|
56
|
-
# fullname.
|
|
57
|
-
# @option params [Integer] :count (0) The number of items already seen
|
|
58
|
-
# in the listing.
|
|
59
|
-
# @option params [1..100] :limit (25) The maximum number of things to
|
|
60
|
-
# return.
|
|
61
|
-
# @return [Redd::Object::Listing] A listing of users.
|
|
62
|
-
# @note On reddit's end, this is actually a UserList, which is slightly
|
|
63
|
-
# different to a real listing, since it only provides names and ids.
|
|
64
|
-
def get_special_users(where, subreddit, params = {})
|
|
65
|
-
name = extract_attribute(subreddit, :display_name)
|
|
66
|
-
response = get "/r/#{name}/about/#{where}.json", params
|
|
67
|
-
|
|
68
|
-
things = response[:data][:children].map! do |user|
|
|
69
|
-
object_from_body(kind: "t2", data: user)
|
|
70
|
-
end
|
|
71
|
-
Redd::Object::Listing.new(data: {children: things})
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Edit Subreddit's stylesheet
|
|
75
|
-
#
|
|
76
|
-
# @param subreddit [Redd::Object::Subreddit, String] The subreddit to
|
|
77
|
-
# submit.
|
|
78
|
-
# @param contents [String] css
|
|
79
|
-
# @param reason [String]
|
|
80
|
-
# @note https://www.reddit.com/r/***/about/stylesheet/ is good place
|
|
81
|
-
# to test if you have an error
|
|
82
|
-
def edit_stylesheet(subreddit, contents, reason = nil)
|
|
83
|
-
name = extract_attribute(subreddit, :display_name)
|
|
84
|
-
path = "/r/#{name}/api/subreddit_stylesheet"
|
|
85
|
-
params = {
|
|
86
|
-
api_type: "json",
|
|
87
|
-
op: "save",
|
|
88
|
-
stylesheet_contents: contents
|
|
89
|
-
}
|
|
90
|
-
params[:reason] = reason if reason
|
|
91
|
-
post path, params
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# Edit Subreddit's settings
|
|
95
|
-
#
|
|
96
|
-
# @param attrs [Hash] Settings for subrredit
|
|
97
|
-
# @note these links might useful: https://www.reddit.com/dev/api and
|
|
98
|
-
# https://github.com/alaycock/MeetCal-bot/blob/master/serverInfo.conf
|
|
99
|
-
def site_admin(attrs)
|
|
100
|
-
path = "/api/site_admin"
|
|
101
|
-
params = {
|
|
102
|
-
allow_top: nil, # boolean
|
|
103
|
-
api_type: "json", # always "json"
|
|
104
|
-
collapse_deleted_comments: nil, # boolean
|
|
105
|
-
comment_score_hide_mins: nil, # int 0..1440 def: 0
|
|
106
|
-
css_on_cname: nil, # boolean
|
|
107
|
-
description: nil, # markdown string
|
|
108
|
-
exclude_banned_modqueue: nil, # boolean
|
|
109
|
-
lang: nil, # valid IETF lang tag, eg: en
|
|
110
|
-
link_type: nil, # string [any, link, self]
|
|
111
|
-
name: nil, # string subreddit name
|
|
112
|
-
over_18: nil, # boolean
|
|
113
|
-
public_description: nil, # markdown string
|
|
114
|
-
public_traffic: nil, # boolean
|
|
115
|
-
show_cname_sidebar: nil, # boolean
|
|
116
|
-
show_media: nil, # boolean
|
|
117
|
-
spam_comments: nil, # string [low, high, all]
|
|
118
|
-
spam_links: nil, # string [low, high, all]
|
|
119
|
-
spam_selfposts: nil, # string [low, high, all]
|
|
120
|
-
sr: nil, # string, for subreddit it should start like "t5_"
|
|
121
|
-
submit_link_label: nil, # string max 60 chars
|
|
122
|
-
submit_text: nil, # markdown string
|
|
123
|
-
submit_text_label: nil, # string max 60 chars
|
|
124
|
-
title: nil, # string max 100 chars
|
|
125
|
-
type: nil, # string [public, private, restricted, gold_restricted, archived]
|
|
126
|
-
wiki_edit_age: nil, # int 0+, def: 0
|
|
127
|
-
wiki_edit_karma: nil, # int 0+, def: 0
|
|
128
|
-
wikimode: nil # string [disabled, modonly, anyone]
|
|
129
|
-
}
|
|
130
|
-
params["header-title"] = '' # string max 500 chars
|
|
131
|
-
|
|
132
|
-
params.keys.each{|key|
|
|
133
|
-
if !attrs[key].nil?
|
|
134
|
-
params[key] = attrs[key]
|
|
135
|
-
end
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
empties = params.map{ |obj|
|
|
139
|
-
obj.last.nil? ? obj.first.to_s : nil
|
|
140
|
-
}
|
|
141
|
-
empties = empties.reject!{ |elm| elm.nil? }
|
|
142
|
-
if !empties.empty?
|
|
143
|
-
raise "The following item should not be nil => [" + empties.join(', ') + ']'
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
post path, params
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# Get the current settings of a subreddit.
|
|
150
|
-
#
|
|
151
|
-
# @param subreddit [Redd::Object::Subreddit, String] The subreddit to
|
|
152
|
-
# submit.
|
|
153
|
-
def about_edit(subreddit)
|
|
154
|
-
name = extract_attribute(subreddit, :display_name)
|
|
155
|
-
object_from_response :get, "/r/#{name}/about/edit.json"
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
private
|
|
159
|
-
|
|
160
|
-
# Subscribe or unsubscribe to a subreddit.
|
|
161
|
-
#
|
|
162
|
-
# @param action [:sub, :unsub] The type of action to perform.
|
|
163
|
-
# @param subreddit [Redd::Object::Subreddit, String] The subreddit to
|
|
164
|
-
# perform the action on.
|
|
165
|
-
def edit_subscription(action, subreddit)
|
|
166
|
-
fullname = extract_fullname(subreddit)
|
|
167
|
-
post "/api/subscribe", action: action, sr: fullname
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
end
|
data/lib/redd/client/oauth2.rb
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
require "redd/client/authenticated"
|
|
2
|
-
|
|
3
|
-
module Redd
|
|
4
|
-
module Client
|
|
5
|
-
# The client to connect using OAuth2.
|
|
6
|
-
class OAuth2 < Redd::Client::Authenticated
|
|
7
|
-
require "redd/client/oauth2/authorization"
|
|
8
|
-
require "redd/client/oauth2/identity"
|
|
9
|
-
|
|
10
|
-
include Redd::Client::OAuth2::Authorization
|
|
11
|
-
include Redd::Client::OAuth2::Identity
|
|
12
|
-
|
|
13
|
-
# @!attribute [r] auth_endpoint
|
|
14
|
-
# @return [String] The site to connect to authenticate with.
|
|
15
|
-
attr_accessor :auth_endpoint
|
|
16
|
-
|
|
17
|
-
# @!attribute [r] client_id
|
|
18
|
-
# @return [String] The client_id of the oauth application.
|
|
19
|
-
attr_reader :client_id
|
|
20
|
-
|
|
21
|
-
# @!attribute [r] redirect_uri
|
|
22
|
-
# @return [String] The exact redirect_uri of the oauth application.
|
|
23
|
-
attr_reader :redirect_uri
|
|
24
|
-
|
|
25
|
-
# @!attribute [rw] access
|
|
26
|
-
# @return [String] The access info used to make requests.
|
|
27
|
-
attr_accessor :access
|
|
28
|
-
|
|
29
|
-
def initialize(client_id, secret, redirect_uri, options = {})
|
|
30
|
-
@client_id = client_id
|
|
31
|
-
@secret = secret
|
|
32
|
-
@redirect_uri = redirect_uri
|
|
33
|
-
|
|
34
|
-
@rate_limit = options[:rate_limit] || Redd::RateLimit.new(1)
|
|
35
|
-
@api_endpoint = options[:api_endpoint] || "https://oauth.reddit.com/"
|
|
36
|
-
@auth_endpoint = options[:auth_endpoint] || "https://ssl.reddit.com/"
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def with_access(access)
|
|
40
|
-
new_instance = dup
|
|
41
|
-
new_instance.access = access
|
|
42
|
-
yield new_instance
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
private
|
|
46
|
-
|
|
47
|
-
def connection
|
|
48
|
-
@connection ||= Faraday.new(url: api_endpoint) do |faraday|
|
|
49
|
-
faraday.use Faraday::Request::UrlEncoded
|
|
50
|
-
faraday.use Redd::Response::RaiseError
|
|
51
|
-
faraday.use Redd::Response::ParseJson
|
|
52
|
-
faraday.adapter Faraday.default_adapter
|
|
53
|
-
|
|
54
|
-
faraday.headers["Authorization"] = "bearer #{@access.access_token}"
|
|
55
|
-
faraday.headers["User-Agent"] = "Redd/Ruby, v#{Redd::VERSION}"
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def auth_connection
|
|
60
|
-
@auth_connection ||= Faraday.new(url: auth_endpoint) do |faraday|
|
|
61
|
-
faraday.use Faraday::Request::UrlEncoded
|
|
62
|
-
faraday.use Redd::Response::RaiseError
|
|
63
|
-
faraday.use Redd::Response::ParseJson
|
|
64
|
-
faraday.adapter Faraday.default_adapter
|
|
65
|
-
|
|
66
|
-
faraday.basic_auth(@client_id, @secret)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
require "redd/oauth2_access"
|
|
2
|
-
|
|
3
|
-
module Redd
|
|
4
|
-
module Client
|
|
5
|
-
class OAuth2
|
|
6
|
-
# Methods for obtaining an access token
|
|
7
|
-
module Authorization
|
|
8
|
-
# Build an authorization url to redirect the user to.
|
|
9
|
-
#
|
|
10
|
-
# @param scopes [Array<String>] The access scopes to request from the
|
|
11
|
-
# user.
|
|
12
|
-
# @param duration [:temporary, :permanent] The duration of your access
|
|
13
|
-
# to the user's account.
|
|
14
|
-
# @param state [String] A random string to check later.
|
|
15
|
-
# @return [String] The url.
|
|
16
|
-
#
|
|
17
|
-
# @note The access tokens from both duration last only an hour, but you
|
|
18
|
-
# also get a refresh token when the duration is permanent.
|
|
19
|
-
# @note You may be tempted to let the state remain "x", but seriously,
|
|
20
|
-
# use this; it helps prevent against CSRF attacks.
|
|
21
|
-
def auth_url(scopes = ["identity"], duration = :temporary, state = "x")
|
|
22
|
-
path = "https://ssl.reddit.com/api/v1/authorize"
|
|
23
|
-
scope = scopes.is_a?(Array) ? scopes.join(",") : scopes
|
|
24
|
-
query = {
|
|
25
|
-
client_id: @client_id,
|
|
26
|
-
redirect_uri: @redirect_uri,
|
|
27
|
-
response_type: "code",
|
|
28
|
-
state: state,
|
|
29
|
-
scope: scope,
|
|
30
|
-
duration: duration
|
|
31
|
-
}
|
|
32
|
-
string_query = query.map { |key, value| "#{key}=#{value}" }.join("&")
|
|
33
|
-
"#{path}?#{string_query}"
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Request an access token from the code that is sent with the redirect.
|
|
37
|
-
#
|
|
38
|
-
# @param code [String] The code that was sent in the GET request.
|
|
39
|
-
# @param set_access [Boolean] Whether to automatically use this token
|
|
40
|
-
# for all future requests with this client.
|
|
41
|
-
# @return [Redd::OAuth2Access, nil] A package of the necessary
|
|
42
|
-
# information to access the user's information or nil if there was
|
|
43
|
-
# an error.
|
|
44
|
-
# @todo Custom Errors for OAuth2
|
|
45
|
-
def request_access(code, set_access = true)
|
|
46
|
-
response = auth_connection.post "/api/v1/access_token",
|
|
47
|
-
grant_type: "authorization_code",
|
|
48
|
-
code: code,
|
|
49
|
-
redirect_uri: @redirect_uri
|
|
50
|
-
|
|
51
|
-
access = Redd::OAuth2Access.new(response.body)
|
|
52
|
-
@access = access if set_access
|
|
53
|
-
access
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# Obtain a new access token using a refresh token.
|
|
57
|
-
#
|
|
58
|
-
# @param token [Redd::OAuth2Access, String, nil] The refresh token or
|
|
59
|
-
# OAuth2Access. If none is provided, it'll refresh the one the client
|
|
60
|
-
# is currently using.
|
|
61
|
-
# @param set_access [Boolean] Whether to automatically use this token
|
|
62
|
-
# for all future requests with this client.
|
|
63
|
-
# @return [Redd::OAuth2Access] The refreshed information.
|
|
64
|
-
def refresh_access(token = nil, set_access = true)
|
|
65
|
-
refresh_token = extract_attribute(token, :refresh_token)
|
|
66
|
-
response = auth_connection.post "/api/v1/access_token",
|
|
67
|
-
grant_type: "refresh_token",
|
|
68
|
-
refresh_token: refresh_token
|
|
69
|
-
|
|
70
|
-
case token
|
|
71
|
-
when nil
|
|
72
|
-
access.refresh(response.body)
|
|
73
|
-
when Redd::OAuth2Access
|
|
74
|
-
token.refresh(response.body)
|
|
75
|
-
when ::String
|
|
76
|
-
new_access = Redd::OAuth2Access.new(response.body)
|
|
77
|
-
@access = new_access if set_access
|
|
78
|
-
new_access
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Dispose of an access or refresh token when you're done with it.
|
|
83
|
-
#
|
|
84
|
-
# @param access [Redd::OAuth2Access, String] The token to revoke.
|
|
85
|
-
# @param remove_refresh_token [Boolean] Whether you intend to revoke a
|
|
86
|
-
# refresh token.
|
|
87
|
-
def revoke_access(access, remove_refresh_token = nil)
|
|
88
|
-
token =
|
|
89
|
-
if remove_refresh_token
|
|
90
|
-
extract_attribute(access, :refresh_token)
|
|
91
|
-
else
|
|
92
|
-
extract_attribute(access, :access_token)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
params = {token: token}
|
|
96
|
-
|
|
97
|
-
if remove_refresh_token
|
|
98
|
-
params[:token_type_hint] = :refresh_token
|
|
99
|
-
elsif remove_refresh_token == false
|
|
100
|
-
params[:token_type_hint] = :access_token
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
auth_connection.post "/api/v1/revoke_token", params
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|