redditkit 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.md +22 -0
- data/README.md +155 -0
- data/Rakefile +8 -0
- data/lib/redditkit.rb +26 -0
- data/lib/redditkit/base.rb +60 -0
- data/lib/redditkit/client.rb +142 -0
- data/lib/redditkit/client/account.rb +73 -0
- data/lib/redditkit/client/apps.rb +63 -0
- data/lib/redditkit/client/captcha.rb +36 -0
- data/lib/redditkit/client/comments.rb +54 -0
- data/lib/redditkit/client/flair.rb +148 -0
- data/lib/redditkit/client/links.rb +134 -0
- data/lib/redditkit/client/miscellaneous.rb +50 -0
- data/lib/redditkit/client/moderation.rb +179 -0
- data/lib/redditkit/client/multireddits.rb +207 -0
- data/lib/redditkit/client/private_messages.rb +74 -0
- data/lib/redditkit/client/search.rb +25 -0
- data/lib/redditkit/client/subreddits.rb +120 -0
- data/lib/redditkit/client/users.rb +109 -0
- data/lib/redditkit/client/utilities.rb +137 -0
- data/lib/redditkit/client/voting.rb +41 -0
- data/lib/redditkit/client/wiki.rb +83 -0
- data/lib/redditkit/comment.rb +54 -0
- data/lib/redditkit/creatable.rb +17 -0
- data/lib/redditkit/error.rb +111 -0
- data/lib/redditkit/link.rb +140 -0
- data/lib/redditkit/moderator_action.rb +19 -0
- data/lib/redditkit/multireddit.rb +32 -0
- data/lib/redditkit/multireddit_description.rb +14 -0
- data/lib/redditkit/paginated_response.rb +22 -0
- data/lib/redditkit/private_message.rb +27 -0
- data/lib/redditkit/response/parse_json.rb +29 -0
- data/lib/redditkit/response/raise_error.rb +21 -0
- data/lib/redditkit/subreddit.rb +86 -0
- data/lib/redditkit/thing.rb +20 -0
- data/lib/redditkit/user.rb +30 -0
- data/lib/redditkit/version.rb +19 -0
- data/lib/redditkit/votable.rb +37 -0
- data/redditkit.gemspec +25 -0
- data/spec/cassettes/RedditKit_Client/should_raise_an_error_with_invalid_credentials.yml +39 -0
- data/spec/cassettes/RedditKit_Client_Account/_sign_in/signs_the_user_in.yml +132 -0
- data/spec/cassettes/RedditKit_Client_Account/_update_session/updates_the_current_session.yml +133 -0
- data/spec/cassettes/RedditKit_Client_Captcha/_captcha_url/returns_a_CAPTCHA_url_from_an_identifier.yml +38 -0
- data/spec/cassettes/RedditKit_Client_Captcha/_needs_captcha_/checks_if_the_current_account_needs_a_CAPTCHA.yml +44 -0
- data/spec/cassettes/RedditKit_Client_Captcha/_new_captcha_identifier/returns_a_new_CAPTCHA_identifier.yml +38 -0
- data/spec/cassettes/RedditKit_Client_Comments/_comment/requests_the_correct_resource.yml +47 -0
- data/spec/cassettes/RedditKit_Client_Comments/_comments/with_a_RedditKit_Link/returns_comments_on_a_link.yml +140 -0
- data/spec/cassettes/RedditKit_Client_Comments/_comments/with_a_link_identifier/returns_comments_on_a_link.yml +89 -0
- data/spec/cassettes/RedditKit_Client_Comments/_submit_comment/requests_the_correct_resource.yml +313 -0
- data/spec/cassettes/RedditKit_Client_Flair/_apply_flair_template/clears_flair_templates.yml +52 -0
- data/spec/cassettes/RedditKit_Client_Flair/_clear_flair_templates/clears_flair_templates.yml +49 -0
- data/spec/cassettes/RedditKit_Client_Flair/_create_flair_template/creates_a_flair_template.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Flair/_create_flair_template/raises_InvalidClassName.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Flair/_create_flair_template/raises_TooManyClassNames.yml +47 -0
- data/spec/cassettes/RedditKit_Client_Flair/_delete_user_flair/requests_the_correct_resource.yml +60 -0
- data/spec/cassettes/RedditKit_Client_Flair/_flair_list/returns_the_list_of_flair.yml +44 -0
- data/spec/cassettes/RedditKit_Client_Flair/_set_flair/requests_the_correct_resource.yml +49 -0
- data/spec/cassettes/RedditKit_Client_Flair/_set_flair_options/sets_flair_options.yml +49 -0
- data/spec/cassettes/RedditKit_Client_Flair/_set_flair_with_csv/requests_the_correct_resource.yml +51 -0
- data/spec/cassettes/RedditKit_Client_Flair/_toggle_flair/requests_the_correct_resource.yml +49 -0
- data/spec/cassettes/RedditKit_Client_Links/_front_page/requests_the_correct_category.yml +498 -0
- data/spec/cassettes/RedditKit_Client_Links/_front_page/requests_the_correct_resource.yml +603 -0
- data/spec/cassettes/RedditKit_Client_Links/_hide/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Links/_link/returns_a_link.yml +55 -0
- data/spec/cassettes/RedditKit_Client_Links/_links/contains_pagination_information.yml +402 -0
- data/spec/cassettes/RedditKit_Client_Links/_links/requests_a_certain_number_of_links.yml +186 -0
- data/spec/cassettes/RedditKit_Client_Links/_links/requests_front_page_links_if_no_subreddit_is_present.yml +603 -0
- data/spec/cassettes/RedditKit_Client_Links/_links/requests_links_with_the_correct_time_frame.yml +375 -0
- data/spec/cassettes/RedditKit_Client_Links/_links/requests_the_correct_subreddit_and_category.yml +402 -0
- data/spec/cassettes/RedditKit_Client_Links/_links_with_domain/returns_links_with_a_specific_domain.yml +99 -0
- data/spec/cassettes/RedditKit_Client_Links/_mark_nsfw/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Links/_random_link/returns_a_random_link.yml +91 -0
- data/spec/cassettes/RedditKit_Client_Links/_submit/raises_RedditKit_InvalidCaptcha_if_no_CAPTCHA_is_filled_out.yml +54 -0
- data/spec/cassettes/RedditKit_Client_Links/_unhide/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Links/_unmark_nsfw/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Miscellaneous/_delete/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Miscellaneous/_edit/requests_the_correct_resource.yml +52 -0
- data/spec/cassettes/RedditKit_Client_Miscellaneous/_save/saves_an_object.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Miscellaneous/_unsave/unsaves_an_object.yml +89 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_accept_moderator_invitation/requests_the_correct_resource.yml +53 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_ban/requests_the_correct_resource.yml +103 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_contributors_to_subreddit/requests_the_correct_resource.yml +47 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_ignore_reports/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_moderation_log/returns_RedditKit_ModeratorAction_objects.yml +153 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_moderators_of_subreddit/requests_the_correct_resource.yml +48 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_reset_subreddit_header/requests_the_correct_resource.yml +55 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_set_contest_mode/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_set_sticky_post/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_unban/requests_the_correct_resource.yml +54 -0
- data/spec/cassettes/RedditKit_Client_Moderation/_unignore_reports/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_add_subreddit_to_multireddit/adds_a_subreddit_to_a_multireddit.yml +177 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_create_multireddit/creates_a_multireddit.yml +137 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_create_multireddit/raises_RedditKit_Conflict_when_using_an_existing_name.yml +133 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_delete_multireddit/deletes_a_multireddit.yml +134 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_multireddit/with_a_path/returns_a_multireddit.yml +39 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_multireddit/without_a_path/returns_a_multireddit.yml +39 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_multireddit_description/with_a_multireddit/returns_a_multireddit_description.yml +81 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_multireddit_description/with_a_username_and_multireddit_name/returns_a_multireddit_description.yml +45 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_my_multireddits/return_s_the_user_s_multireddits.yml +47 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_remove_subreddit_from_multireddit/removes_a_subreddit_from_a_multireddit.yml +175 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_rename_multireddit/renames_a_multireddit.yml +134 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_set_multireddit_description/returns_a_multireddit_description.yml +48 -0
- data/spec/cassettes/RedditKit_Client_Multireddits/_update_multireddit/updates_a_multireddit.yml +184 -0
- data/spec/cassettes/RedditKit_Client_PrivateMessages/_block_author_of_message/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_PrivateMessages/_mark_as_read/requests_the_correct_resource.yml +51 -0
- data/spec/cassettes/RedditKit_Client_PrivateMessages/_mark_as_unread/requests_the_correct_resource.yml +51 -0
- data/spec/cassettes/RedditKit_Client_PrivateMessages/_messages/requests_the_correct_resource.yml +187 -0
- data/spec/cassettes/RedditKit_Client_PrivateMessages/_unblock/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Search/_search/restricts_searches_to_a_specific_subreddit.yml +878 -0
- data/spec/cassettes/RedditKit_Client_Search/_search/returns_a_specific_number_of_results.yml +130 -0
- data/spec/cassettes/RedditKit_Client_Search/_search/returns_search_results.yml +844 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_random_subreddit/returns_a_random_subreddit.yml +181 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_recommended_subreddits/returns_subreddit_names.yml +37 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_search_subreddits_by_name/returns_subreddit_names.yml +875 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subreddit/returns_a_specified_subreddit.yml +100 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subreddits/returns_a_specified_number_of_subreddits.yml +505 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subreddits/returns_subreddits_from_a_specific_category.yml +510 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subreddits_by_topic/returns_subreddit_names.yml +41 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subscribe/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subscribed_subreddits/returns_a_specified_number_of_subreddits.yml +415 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subscribed_subreddits/returns_subreddits_from_a_specific_category.yml +58 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_subscribed_subreddits/returns_the_user_s_subscribed_subreddits.yml +3469 -0
- data/spec/cassettes/RedditKit_Client_Subreddits/_unsubscribe/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Users/_friends/returns_the_user_s_friends.yml +48 -0
- data/spec/cassettes/RedditKit_Client_Users/_my_content/returns_the_user_s_content.yml +60 -0
- data/spec/cassettes/RedditKit_Client_Users/_user/requests_the_correct_resource.yml +48 -0
- data/spec/cassettes/RedditKit_Client_Users/_user/returns_a_specified_user.yml +48 -0
- data/spec/cassettes/RedditKit_Client_Users/_user/returns_the_authenticated_user.yml +48 -0
- data/spec/cassettes/RedditKit_Client_Users/_user_content/returns_the_user_s_content.yml +41 -0
- data/spec/cassettes/RedditKit_Client_Users/_username_available_/returns_false_for_an_unavailable_username.yml +36 -0
- data/spec/cassettes/RedditKit_Client_Users/_username_available_/returns_true_for_an_available_username.yml +36 -0
- data/spec/cassettes/RedditKit_Client_Voting/_downvote/with_a_comment_full_name_passed/downvotes_the_comment.yml +100 -0
- data/spec/cassettes/RedditKit_Client_Voting/_downvote/with_a_comment_passed/downvotes_the_comment.yml +154 -0
- data/spec/cassettes/RedditKit_Client_Voting/_downvote/with_a_link_full_name_passed/downvotes_the_link.yml +106 -0
- data/spec/cassettes/RedditKit_Client_Voting/_downvote/with_a_link_passed/downvotes_the_link.yml +166 -0
- data/spec/cassettes/RedditKit_Client_Voting/_upvote/with_a_comment_full_name_passed/upvotes_the_comment.yml +100 -0
- data/spec/cassettes/RedditKit_Client_Voting/_upvote/with_a_comment_passed/upvotes_the_comment.yml +154 -0
- data/spec/cassettes/RedditKit_Client_Voting/_upvote/with_a_link_full_name_passed/upvotes_the_link.yml +106 -0
- data/spec/cassettes/RedditKit_Client_Voting/_upvote/with_a_link_passed/upvotes_the_link.yml +166 -0
- data/spec/cassettes/RedditKit_Client_Voting/_withdraw_vote/with_a_comment_full_name_passed/withdraws_the_vote_on_the_comment.yml +154 -0
- data/spec/cassettes/RedditKit_Client_Voting/_withdraw_vote/with_a_comment_passed/withdraws_the_vote_on_the_comment.yml +208 -0
- data/spec/cassettes/RedditKit_Client_Voting/_withdraw_vote/with_a_link_full_name_passed/withdraws_the_vote_on_the_link.yml +166 -0
- data/spec/cassettes/RedditKit_Client_Voting/_withdraw_vote/with_a_link_passed/withdraws_the_vote_on_the_link.yml +226 -0
- data/spec/cassettes/RedditKit_Client_Wiki/_add_wiki_editor/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Wiki/_edit_wiki_page/requests_the_correct_resource.yml +48 -0
- data/spec/cassettes/RedditKit_Client_Wiki/_hide_wiki_revision/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Wiki/_remove_wiki_editor/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Client_Wiki/_revert_to_revision/requests_the_correct_resource.yml +46 -0
- data/spec/cassettes/RedditKit_Comment/should_not_be_deleted_if_neither_author_and_comment_attributes_are_set_to_deleted_.yml +90 -0
- data/spec/cassettes/RedditKit_Comment/should_return_replies.yml +90 -0
- data/spec/cassettes/authenticated_client.yml +87 -0
- data/spec/redditkit/base_spec.rb +45 -0
- data/spec/redditkit/client/account_spec.rb +50 -0
- data/spec/redditkit/client/apps_spec.rb +58 -0
- data/spec/redditkit/client/captcha_spec.rb +30 -0
- data/spec/redditkit/client/comments_spec.rb +40 -0
- data/spec/redditkit/client/flair_spec.rb +92 -0
- data/spec/redditkit/client/links_spec.rb +103 -0
- data/spec/redditkit/client/miscellaneous_spec.rb +40 -0
- data/spec/redditkit/client/moderation_spec.rb +141 -0
- data/spec/redditkit/client/multireddits_spec.rb +158 -0
- data/spec/redditkit/client/private_messages_spec.rb +51 -0
- data/spec/redditkit/client/search_spec.rb +25 -0
- data/spec/redditkit/client/subreddits_spec.rb +83 -0
- data/spec/redditkit/client/users_spec.rb +92 -0
- data/spec/redditkit/client/voting_spec.rb +99 -0
- data/spec/redditkit/client/wiki_spec.rb +40 -0
- data/spec/redditkit/client_spec.rb +46 -0
- data/spec/redditkit/comment_spec.rb +26 -0
- data/spec/redditkit/creatable_spec.rb +24 -0
- data/spec/redditkit/error_spec.rb +61 -0
- data/spec/redditkit/link_spec.rb +33 -0
- data/spec/redditkit/multireddit_spec.rb +27 -0
- data/spec/redditkit/paginated_response_spec.rb +23 -0
- data/spec/redditkit/thing_spec.rb +18 -0
- data/spec/redditkit/votable_spec.rb +52 -0
- data/spec/redditkit_spec.rb +21 -0
- data/spec/spec_helper.rb +124 -0
- metadata +390 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
module RedditKit
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Methods for operating on apps in the current user's account.
|
5
|
+
module Apps
|
6
|
+
|
7
|
+
# Create or update an app.
|
8
|
+
#
|
9
|
+
# @param name [String] The app's name.
|
10
|
+
# @option options [String] description The app's description.
|
11
|
+
# @option options [String] about_url The app's URL.
|
12
|
+
# @option options [String] redirect_url The app's redirect URL.
|
13
|
+
# @option options [String] app_identifier The identifier of the app, if you are updating an existing one.
|
14
|
+
def create_app(name, options = {})
|
15
|
+
description = options[:description]
|
16
|
+
about_url = options[:about_url]
|
17
|
+
redirect_url = options[:redirect_url]
|
18
|
+
app_identifier = options[:app_identifier]
|
19
|
+
parameters = { :client_id => app_identifier, :name => name, :description => description, :about_url => about_url, :redirect_uri => redirect_url }
|
20
|
+
|
21
|
+
post('api/updateapp', parameters)
|
22
|
+
end
|
23
|
+
alias update_app create_app
|
24
|
+
|
25
|
+
# Delete an app.
|
26
|
+
#
|
27
|
+
# @param app_identifier [String] The identifier of the app.
|
28
|
+
def delete_app(app_identifier)
|
29
|
+
post('api/deleteapp', { :client_id => app_identifier })
|
30
|
+
end
|
31
|
+
|
32
|
+
# Revoke an app.
|
33
|
+
#
|
34
|
+
# @param app_identifier [String] The identifier of the app.
|
35
|
+
def revoke_app(app_identifier)
|
36
|
+
post('api/revokeapp', { :client_id => app_identifier })
|
37
|
+
end
|
38
|
+
|
39
|
+
# Add a user as a developer of an app.
|
40
|
+
#
|
41
|
+
# @param user [String, RedditKit::User] The username of the user to add, or a RedditKit::User.
|
42
|
+
# @param app_identifier [String] The identifier of the app.
|
43
|
+
def add_developer(user, app_identifier)
|
44
|
+
username = extract_string user, :username
|
45
|
+
parameters = { :name => username, :client_id => app_identifier }
|
46
|
+
|
47
|
+
post('api/adddeveloper', parameters)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Remove an app's developer.
|
51
|
+
#
|
52
|
+
# @param user [String, RedditKit::User] The username of the user to add, or a RedditKit::User.
|
53
|
+
# @param app_identifier [String] The identifier of the app.
|
54
|
+
def remove_developer(user, app_identifier)
|
55
|
+
username = extract_string user, :username
|
56
|
+
parameters = { :name => username, :client_id => app_identifier }
|
57
|
+
|
58
|
+
post('api/removedeveloper', parameters)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module RedditKit
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Methods for retrieving and submitting CAPTCHAs.
|
5
|
+
module Captcha
|
6
|
+
|
7
|
+
# Whether the current user will need to answer a CAPTCHA for methods which may require one.
|
8
|
+
#
|
9
|
+
# @return [Boolean]
|
10
|
+
def needs_captcha?
|
11
|
+
response = get('api/needs_captcha.json', nil)
|
12
|
+
needs_captcha = response[:body]
|
13
|
+
|
14
|
+
needs_captcha == 'true'
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns a new CATPCHA identifier.
|
18
|
+
#
|
19
|
+
# @return [String] The CAPTCHA identifier.
|
20
|
+
def new_captcha_identifier
|
21
|
+
response = post('api/new_captcha', { :api_type => :json })
|
22
|
+
data = response[:body][:json][:data]
|
23
|
+
|
24
|
+
data[:iden]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the URL for a CAPTCHA image with a given identifier.
|
28
|
+
#
|
29
|
+
# @return [String]
|
30
|
+
def captcha_url(captcha_identifier)
|
31
|
+
"http://reddit.com/captcha/#{captcha_identifier}.png"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'redditkit/comment'
|
2
|
+
|
3
|
+
module RedditKit
|
4
|
+
class Client
|
5
|
+
|
6
|
+
# Methods for interacting with comment threads.
|
7
|
+
module Comments
|
8
|
+
|
9
|
+
# Get a comment object from its full name.
|
10
|
+
#
|
11
|
+
# @param comment_full_name [String] The full name of the comment.
|
12
|
+
# @return [RedditKit::Comment]
|
13
|
+
# @note This method does not include any replies to the comment.
|
14
|
+
def comment(comment_full_name)
|
15
|
+
comments = objects_from_response(:get, 'api/info.json', { :id => comment_full_name })
|
16
|
+
comments.first
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get comments on a link.
|
20
|
+
#
|
21
|
+
# @param link [String, RedditKit::Link] The identifier of the link, or a RedditKit::Link.
|
22
|
+
# @option options [Integer] :limit The number of comments to return.
|
23
|
+
# @return [Array<RedditKit::Comment>]
|
24
|
+
def comments(link, options = {})
|
25
|
+
return nil unless link
|
26
|
+
|
27
|
+
link_id = extract_id link
|
28
|
+
path = "comments/#{link_id}.json"
|
29
|
+
|
30
|
+
comments_from_response(:get, path, options)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Submit a comment on a link or comment.
|
34
|
+
#
|
35
|
+
# @param link_or_comment [String, RedditKit::Comment, RedditKit::Link] The object to comment on.
|
36
|
+
# @param text [String] The text of the comment, formatted as Markdown.
|
37
|
+
# @return [RedditKit::Comment] The new comment object.
|
38
|
+
def submit_comment(link_or_comment, text)
|
39
|
+
object_full_name = extract_full_name link_or_comment
|
40
|
+
parameters = { :text => text, :thing_id => object_full_name, :api_type => :json }
|
41
|
+
|
42
|
+
response = post('/api/comment', parameters)
|
43
|
+
response_data = response[:body][:json][:data]
|
44
|
+
|
45
|
+
full_comment_data = response_data[:things].first
|
46
|
+
comment_data = full_comment_data[:data]
|
47
|
+
comment_full_name = comment_data[:id]
|
48
|
+
|
49
|
+
comment comment_full_name
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module RedditKit
|
4
|
+
class Client
|
5
|
+
|
6
|
+
# Methods for interacting with flair in subreddits.
|
7
|
+
module Flair
|
8
|
+
|
9
|
+
# Lists users and their flair in a subreddit.
|
10
|
+
#
|
11
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's name, or a RedditKit::Subreddit.
|
12
|
+
# @option options [1..1000] :limit The number of items to return.
|
13
|
+
# @option options [String] :before Only return objects before this id.
|
14
|
+
# @option options [String] :after Only return objects after this id.
|
15
|
+
def flair_list(subreddit, options = {})
|
16
|
+
subreddit_name = extract_string(subreddit, :display_name)
|
17
|
+
list = get("/r/#{subreddit_name}/api/flairlist.json", options)
|
18
|
+
users = list[:body][:users]
|
19
|
+
|
20
|
+
users.collect { |user| OpenStruct.new(user) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# Creates a flair template in a subreddit.
|
24
|
+
#
|
25
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's name, or a RedditKit::Subreddit.
|
26
|
+
# @param type [user, link] The template's type. Defaults to user.
|
27
|
+
# @option options [String] text The text value for the template.
|
28
|
+
# @option options [String] css_class The CSS class for the template.
|
29
|
+
# @option options [Boolean] user_editable Whether the template should be editable by users.
|
30
|
+
def create_flair_template(subreddit, type, options = {})
|
31
|
+
subreddit_name = extract_string(subreddit, :display_name)
|
32
|
+
flair_type = (type.to_s == 'link') ? 'LINK_FLAIR' : 'USER_FLAIR'
|
33
|
+
|
34
|
+
parameters = { :r => subreddit_name, :flair_type => flair_type, :text => options[:text], :css_class => options[:css_class], :api_type => :json }
|
35
|
+
parameters[:text_editable] = 'on' if options[:user_editable]
|
36
|
+
|
37
|
+
post('api/flairtemplate', parameters)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Deletes a flair template.
|
41
|
+
#
|
42
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's name, or a RedditKit::Subreddit.
|
43
|
+
# @param template_identifier [String] The template's identifier.
|
44
|
+
def delete_flair_template(subreddit, template_identifier)
|
45
|
+
subreddit_name = extract_string(subreddit, :display_name)
|
46
|
+
parameters = { :flair_template_id => template_identifier, :r => subreddit_name }
|
47
|
+
|
48
|
+
post('api/deleteflairtemplate', parameters)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Toggles flair for a subreddit.
|
52
|
+
#
|
53
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's name, or a RedditKit::Subreddit.
|
54
|
+
# @param flair_enabled [Boolean] Whether to enable flair for the subreddit.
|
55
|
+
def toggle_flair(subreddit, flair_enabled)
|
56
|
+
post('api/setflairenabled', { :r => subreddit, :flair_enabled => flair_enabled })
|
57
|
+
end
|
58
|
+
|
59
|
+
# Sets flair on a link or user.
|
60
|
+
#
|
61
|
+
# @option options [String, RedditKit::Subreddit] subreddit A subreddit's name, or a RedditKit::Subreddit.
|
62
|
+
# @option options [String] text The text value for the template.
|
63
|
+
# @option options [String] css_class The CSS class for the template.
|
64
|
+
# @option options [String, RedditKit::Link] link A link's full name, or a RedditKit::Link.
|
65
|
+
# @option options [String, RedditKit::User] user A user's username, or a RedditKit::User.
|
66
|
+
# @note Raises RedditKit::BadClassName if any CSS classes contain invalid characters, or RedditKit::TooManyClassNames if there are too many.
|
67
|
+
def set_flair(options)
|
68
|
+
subreddit_name = extract_string(options[:subreddit], :display_name)
|
69
|
+
link_full_name = extract_full_name options[:link]
|
70
|
+
username = extract_string options[:user], :username
|
71
|
+
|
72
|
+
parameters = { :r => subreddit_name, :text => options[:text], :css_class => options[:css_class], :name => username, :link => link_full_name }
|
73
|
+
|
74
|
+
post('api/flair', parameters)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Sets a subreddit's flair using a string formatted as CSV.
|
78
|
+
#
|
79
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's name, or a RedditKit::Subreddit.
|
80
|
+
# @param csv_string [String] A string in CSV format.
|
81
|
+
# @note Each line in the string should be in the format 'user,flair-text,css_class'.
|
82
|
+
def set_flair_with_csv(subreddit, csv_string)
|
83
|
+
subreddit_name = extract_string(subreddit, :display_name)
|
84
|
+
parameters = { :r => subreddit_name, :flair_csv => csv_string }
|
85
|
+
|
86
|
+
post('api/flaircsv', parameters)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Clears a user's flair.
|
90
|
+
#
|
91
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's name, or a RedditKit::Subreddit.
|
92
|
+
# @param user [String, RedditKit::User] A subreddit's name, or a RedditKit::Subreddit.
|
93
|
+
def delete_user_flair(subreddit, user)
|
94
|
+
subreddit_name = extract_string(subreddit, :display_name)
|
95
|
+
username = extract_string(user, :username)
|
96
|
+
parameters = { :name => username, :r => subreddit_name }
|
97
|
+
|
98
|
+
post('api/deleteflair', parameters)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Clears all flair templates of a certain type.
|
102
|
+
#
|
103
|
+
# @option options [String, RedditKit::Subreddit] subreddit A subreddit's name, or a RedditKit::Subreddit.
|
104
|
+
# @option options [user, link] type The template's type. Defaults to user.
|
105
|
+
def clear_flair_templates(options)
|
106
|
+
subreddit_name = extract_string(options[:subreddit], :display_name)
|
107
|
+
flair_type = 'USER_FLAIR'
|
108
|
+
flair_type = 'LINK_FLAIR' if options[:type].to_s == 'link'
|
109
|
+
|
110
|
+
parameters = { :r => subreddit_name, :flair_type => flair_type, :text => options[:text], :css_class => options[:css_class] }
|
111
|
+
|
112
|
+
post('api/clearflairtemplates', parameters)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Applys a flair template to a link or user.
|
116
|
+
#
|
117
|
+
# @option options [String, RedditKit::Subreddit] subreddit A subreddit's name, or a RedditKit::Subreddit.
|
118
|
+
# @option options [String] template_id The template's identifier.
|
119
|
+
# @option options [String, RedditKit::Link] link A link's full name, or a RedditKit::Link.
|
120
|
+
# @option options [String, RedditKit::User] user A user's username, or a RedditKit::User.
|
121
|
+
def apply_flair_template(options)
|
122
|
+
subreddit_name = extract_string(options[:subreddit], :display_name)
|
123
|
+
link_full_name = extract_full_name options[:link]
|
124
|
+
username = extract_string options[:user], :username
|
125
|
+
|
126
|
+
parameters = { :flair_template_id => options[:template_id], :r => subreddit_name, :name => username, :link => link_full_name }
|
127
|
+
|
128
|
+
post('api/selectflair', parameters)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Sets flair options for a subreddit.
|
132
|
+
#
|
133
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's name, or a RedditKit::Subreddit.
|
134
|
+
# @option options [Boolean] flair_enabled Whether to enable flair for the subreddit.
|
135
|
+
# @option options [left, right] flair_position The position of user flair.
|
136
|
+
# @option options [left, right] link_flair_position The position of link flair.
|
137
|
+
# @option options [Boolean] flair_self_assign_enabled Whether users may assign their own flair.
|
138
|
+
# @option options [Boolean] link_flair_self_assign_enabled Whether users may assign their own link flair.
|
139
|
+
def set_flair_options(subreddit, options = {})
|
140
|
+
subreddit_name = extract_string(subreddit, :display_name)
|
141
|
+
options.merge!({ :r => subreddit_name, :uh => @modhash })
|
142
|
+
|
143
|
+
post('api/flairconfig', options)
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'redditkit/link'
|
2
|
+
|
3
|
+
module RedditKit
|
4
|
+
class Client
|
5
|
+
|
6
|
+
# Methods for retrieving, submitting and interacting with links.
|
7
|
+
module Links
|
8
|
+
|
9
|
+
# Gets the links currently on the front page.
|
10
|
+
#
|
11
|
+
# @option options [hot, new, rising, controversial, top] :category The category from which to retrieve links.
|
12
|
+
# @option options [hour, day, week, month, year, all] :time The time from which to retrieve links. Defaults to all time.
|
13
|
+
# @option options [1..100] :limit The number of links to return.
|
14
|
+
# @option options [String] :before Only return links before this identifier.
|
15
|
+
# @option options [String] :after Only return links after this identifier.
|
16
|
+
# @return [RedditKit::PaginatedResponse]
|
17
|
+
def front_page(options = {})
|
18
|
+
links nil, options
|
19
|
+
end
|
20
|
+
|
21
|
+
# Gets an array of links from a specific subreddit.
|
22
|
+
#
|
23
|
+
# @param subreddit [String, RedditKit::Subreddit] The display name of the subreddit, or a RedditKit::Subreddit.
|
24
|
+
# @option options [hot, new, rising, controversial, top] :category The category from which to retrieve links.
|
25
|
+
# @option options [hour, day, week, month, year, all] :time The time from which to retrieve links. Defaults to all time.
|
26
|
+
# @option options [1..100] :limit The number of links to return.
|
27
|
+
# @option options [String] :before Only return links before this identifier.
|
28
|
+
# @option options [String] :after Only return links after this identifier.
|
29
|
+
# @return [RedditKit::PaginatedResponse]
|
30
|
+
def links(subreddit, options = {})
|
31
|
+
subreddit_name = extract_string(subreddit, :display_name) if subreddit
|
32
|
+
category = options[:category] || :hot
|
33
|
+
|
34
|
+
path = "%s/#{category.to_s}.json" % ('r/' + subreddit_name if subreddit_name)
|
35
|
+
|
36
|
+
options[:t] = options[:time] if options[:time]
|
37
|
+
options.delete :category
|
38
|
+
options.delete :time
|
39
|
+
|
40
|
+
objects_from_response(:get, path, options)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Gets a link object from its full name.
|
44
|
+
#
|
45
|
+
# @param link_full_name [String] The full name of the link.
|
46
|
+
# @return [RedditKit::Link]
|
47
|
+
# @note This method will return nil if there is not a user currently signed in.
|
48
|
+
def link(link_full_name)
|
49
|
+
links = objects_from_response(:get, 'api/info.json', { :id => link_full_name })
|
50
|
+
links.first
|
51
|
+
end
|
52
|
+
|
53
|
+
# Gets links with a specific domain.
|
54
|
+
#
|
55
|
+
# @param domain [String] The domain for which to get links.
|
56
|
+
# @option options [hour, day, week, month, year] :time The time from which to retrieve links. Defaults to all time.
|
57
|
+
# @option options [1..100] :limit The number of links to return.
|
58
|
+
# @option options [String] :before Only return links before this identifier.
|
59
|
+
# @option options [String] :after Only return links after this identifier.
|
60
|
+
# @return [RedditKit::PaginatedResponse]
|
61
|
+
# @example links = RedditKit.links_with_domain "github.com"
|
62
|
+
def links_with_domain(domain, options = {})
|
63
|
+
parameters = { :url => domain, :t => options[:time] }
|
64
|
+
options.merge! parameters
|
65
|
+
options.delete :t
|
66
|
+
|
67
|
+
objects_from_response(:get, 'api/info.json', options)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Submits a link or self post to reddit.
|
71
|
+
#
|
72
|
+
# @param title [String] The title of the post.
|
73
|
+
# @param subreddit [String, RedditKit::Subreddit] A subreddit's display name, or a RedditKit::Subreddit.
|
74
|
+
# @option options [String] :url The URL for the post. Note that if this value is present, :text will be ignored.
|
75
|
+
# @option options [String] :text The text value for the post, as Markdown.
|
76
|
+
# @option options [String] :captcha_identifier An identifier for a CAPTCHA, if the current user is required to fill one out.
|
77
|
+
# @option options [String] :captcha_value The value for the CAPTCHA with the given identifier, as filled out by the user.
|
78
|
+
def submit(title, subreddit, options = {})
|
79
|
+
subreddit_name = extract_string subreddit, :display_name
|
80
|
+
parameters = { :title => title, :sr => subreddit_name, :iden => options[:captcha_identifier], :captcha => options[:captcha_value] }
|
81
|
+
|
82
|
+
if options[:url]
|
83
|
+
parameters[:url] = options[:url]
|
84
|
+
else
|
85
|
+
parameters[:text] = options[:text]
|
86
|
+
end
|
87
|
+
|
88
|
+
post('api/submit', parameters)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Marks a link as not safe for work.
|
92
|
+
#
|
93
|
+
# @param link [String, RedditKit::Link] A link's full name, or a RedditKit::Link.
|
94
|
+
def mark_nsfw(link)
|
95
|
+
post('api/marknsfw', { :id => extract_full_name(link) })
|
96
|
+
end
|
97
|
+
|
98
|
+
# Marks a link as safe for work.
|
99
|
+
#
|
100
|
+
# @param link [String, RedditKit::Subreddit] A link's full name, or a RedditKit::Link.
|
101
|
+
def mark_sfw(link)
|
102
|
+
post('api/unmarknsfw', { :id => extract_full_name(link) })
|
103
|
+
end
|
104
|
+
alias unmark_nsfw mark_sfw
|
105
|
+
|
106
|
+
# Hides a link.
|
107
|
+
#
|
108
|
+
# @param link [String, RedditKit::Link] A link's full name, or a RedditKit::Link.
|
109
|
+
def hide(link)
|
110
|
+
post('api/hide', { :id => extract_full_name(link) })
|
111
|
+
end
|
112
|
+
|
113
|
+
# Unhides a link.
|
114
|
+
#
|
115
|
+
# @param link [String, RedditKit::Link] A link's full name, or a RedditKit::Link.
|
116
|
+
def unhide(link)
|
117
|
+
post('api/unhide', { :id => extract_full_name(link) })
|
118
|
+
end
|
119
|
+
|
120
|
+
# Gets a random link.
|
121
|
+
#
|
122
|
+
# @return [RedditKit::Link]
|
123
|
+
def random_link
|
124
|
+
response = get('/random', nil)
|
125
|
+
headers = response[:response_headers]
|
126
|
+
location = headers[:location]
|
127
|
+
|
128
|
+
link_id = location[/\/tb\/(.*)/, 1]
|
129
|
+
link "t3_#{link_id}"
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module RedditKit
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Methods which don't belong in any clear categroy, such as editing and deleting items on reddit.
|
5
|
+
module Miscellaneous
|
6
|
+
|
7
|
+
# Edit the text or a self post or comment.
|
8
|
+
#
|
9
|
+
# @param object [String, RedditKit::Comment, RedditKit::Link] A link or comment's full name, a RedditKit::Link, or a RedditKit::Subreddit.
|
10
|
+
# @option options [String] text The new text for the link or comment.
|
11
|
+
def edit(object, options)
|
12
|
+
parameters = { :text => options[:text], :thing_id => extract_full_name(object) }
|
13
|
+
post('/api/editusertext', parameters)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Deletes a link or comment.
|
17
|
+
#
|
18
|
+
# @param object [String, RedditKit::Comment, RedditKit::Link] A link or comment's full name, a RedditKit::Link, or a RedditKit::Subreddit.
|
19
|
+
def delete(object)
|
20
|
+
full_name = extract_full_name object
|
21
|
+
post('api/del', { :id => full_name })
|
22
|
+
end
|
23
|
+
|
24
|
+
# Saves a link or comment.
|
25
|
+
#
|
26
|
+
# @param object [String, RedditKit::Link, RedditKit::Subreddit] A link or comment's full name, a RedditKit::Link, or a RedditKit::Subreddit.
|
27
|
+
def save(object)
|
28
|
+
full_name = extract_full_name object
|
29
|
+
post('api/save', { :id => full_name })
|
30
|
+
end
|
31
|
+
|
32
|
+
# Unsaves a link or comment.
|
33
|
+
#
|
34
|
+
# @param object [String, RedditKit::Link, RedditKit::Subreddit] A link or comment's full name, a RedditKit::Link, or a RedditKit::Subreddit.
|
35
|
+
def unsave(object)
|
36
|
+
full_name = extract_full_name object
|
37
|
+
post('api/unsave', { :id => full_name })
|
38
|
+
end
|
39
|
+
|
40
|
+
# Reports a link or comment. The reddit API will also hide the link or comment.
|
41
|
+
#
|
42
|
+
# @param object [String, RedditKit::Link, RedditKit::Comment] A link or comment's full name, a RedditKit::Link, or a RedditKit::Subreddit.
|
43
|
+
def report(object)
|
44
|
+
full_name = extract_full_name object
|
45
|
+
post('api/report', { :id => full_name })
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|