mastodon-api 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mastodon.rb +2 -0
  3. data/lib/mastodon/access_token.rb +21 -0
  4. data/lib/mastodon/account.rb +44 -2
  5. data/lib/mastodon/app.rb +8 -1
  6. data/lib/mastodon/card.rb +41 -0
  7. data/lib/mastodon/client.rb +8 -1
  8. data/lib/mastodon/conversation.rb +25 -0
  9. data/lib/mastodon/emoji.rb +21 -0
  10. data/lib/mastodon/entities/app.rb +12 -0
  11. data/lib/mastodon/entities/hashtag.rb +12 -0
  12. data/lib/mastodon/entities/media.rb +13 -1
  13. data/lib/mastodon/entities/mention.rb +1 -1
  14. data/lib/mastodon/field.rb +18 -0
  15. data/lib/mastodon/filter.rb +29 -0
  16. data/lib/mastodon/hashtag.rb +19 -0
  17. data/lib/mastodon/instance.rb +33 -0
  18. data/lib/mastodon/list.rb +15 -0
  19. data/lib/mastodon/media.rb +16 -2
  20. data/lib/mastodon/notification.rb +30 -0
  21. data/lib/mastodon/relationship.rb +23 -2
  22. data/lib/mastodon/rest/accounts.rb +52 -9
  23. data/lib/mastodon/rest/api.rb +24 -0
  24. data/lib/mastodon/rest/apps.rb +7 -0
  25. data/lib/mastodon/rest/conversations.rb +34 -0
  26. data/lib/mastodon/rest/custom_emojis.rb +16 -0
  27. data/lib/mastodon/rest/domain_blocks.rb +32 -0
  28. data/lib/mastodon/rest/endorsements.rb +36 -0
  29. data/lib/mastodon/rest/filters.rb +61 -0
  30. data/lib/mastodon/rest/instances.rb +28 -0
  31. data/lib/mastodon/rest/lists.rb +77 -0
  32. data/lib/mastodon/rest/media.rb +17 -3
  33. data/lib/mastodon/rest/notifications.rb +34 -0
  34. data/lib/mastodon/rest/relationships.rb +68 -1
  35. data/lib/mastodon/rest/reports.rb +20 -0
  36. data/lib/mastodon/rest/request.rb +7 -3
  37. data/lib/mastodon/rest/scheduled_statuses.rb +43 -0
  38. data/lib/mastodon/rest/search.rb +20 -0
  39. data/lib/mastodon/rest/statuses.rb +57 -5
  40. data/lib/mastodon/rest/suggestions.rb +13 -2
  41. data/lib/mastodon/rest/timelines.rb +19 -0
  42. data/lib/mastodon/rest/utils.rb +3 -3
  43. data/lib/mastodon/results.rb +18 -0
  44. data/lib/mastodon/scheduled_status.rb +25 -0
  45. data/lib/mastodon/status.rb +49 -4
  46. data/lib/mastodon/streaming/client.rb +96 -0
  47. data/lib/mastodon/streaming/connection.rb +44 -0
  48. data/lib/mastodon/streaming/events/filters_change.rb +7 -0
  49. data/lib/mastodon/streaming/events/status_delete.rb +16 -0
  50. data/lib/mastodon/streaming/message_parser.rb +23 -0
  51. data/lib/mastodon/streaming/response.rb +42 -0
  52. data/lib/mastodon/version.rb +2 -2
  53. data/mastodon.gemspec +5 -3
  54. metadata +68 -9
@@ -7,10 +7,24 @@ module Mastodon
7
7
  include Mastodon::REST::Utils
8
8
 
9
9
  # Upload a media file
10
- # @param file [HTTP::FormData::File]
10
+ # @param file [File, StringIO, HTTP::FormData::File]
11
+ # @param params [Hash]
12
+ # @option params :description [String] Alternative text
13
+ # @option params :focus [String] Two floating points, comma-delimited
11
14
  # @return [Mastodon::Media]
12
- def upload_media(file)
13
- perform_request_with_object(:post, '/api/v1/media', { file: file }, Mastodon::Media)
15
+ def upload_media(file, params = {})
16
+ file = file.is_a?(HTTP::FormData::File) ? file : HTTP::FormData::File.new(file)
17
+ perform_request_with_object(:post, '/api/v1/media', { file: file }.merge(params), Mastodon::Media)
18
+ end
19
+
20
+ # Update a media description, can only be updated while it's not associated to a status
21
+ # @param id [Integer]
22
+ # @param params [Hash]
23
+ # @option params :description [String] Alternative text
24
+ # @option params :focus [String] Two floating points, comma-delimited
25
+ # @return [Mastodon::Media]
26
+ def update_media(id, params)
27
+ perform_request_with_object(:put, "/api/v1/media/#{media_id}", params, Mastodon::Media)
14
28
  end
15
29
  end
16
30
  end
@@ -0,0 +1,34 @@
1
+ require 'mastodon/rest/utils'
2
+ require 'mastodon/notification'
3
+
4
+ module Mastodon
5
+ module REST
6
+ module Notifications
7
+ include Mastodon::REST::Utils
8
+
9
+ # Get a list of notifications for the authenticated user
10
+ # @param options [Hash]
11
+ # @option options :max_id [Integer]
12
+ # @option options :since_id [Integer]
13
+ # @option options :min_id [Integer]
14
+ # @option options :limit [Integer]
15
+ # @option options :exclude_types [Array<String>]
16
+ # @return [Mastodon::Collection<Mastodon::Notification>]
17
+ def notifications(options = {})
18
+ options[:'exclude_types[]'] = options.delete(:exclude_types) if options.key?(:exclude_types)
19
+ perform_request_with_collection(:get, '/api/v1/notifications', options, Mastodon::Notification)
20
+ end
21
+
22
+ # Dismiss a notification
23
+ # @param id [Integer]
24
+ def dismiss_notification(id)
25
+ perform_request(:post, "/api/v1/notifications/#{id}/dismiss")
26
+ end
27
+
28
+ # Clear all notifications
29
+ def clear_notifications
30
+ perform_request(:post, '/api/v1/notifications/clear')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,6 @@
1
1
  require 'mastodon/rest/utils'
2
2
  require 'mastodon/relationship'
3
+ require 'mastodon/status'
3
4
 
4
5
  module Mastodon
5
6
  module REST
@@ -10,7 +11,30 @@ module Mastodon
10
11
  # @param ids [Integer]
11
12
  # @return [Mastodon::Collection<Mastodon::Relationship>]
12
13
  def relationships(*ids)
13
- perform_request_with_collection(:get, '/api/v1/accounts/relationships', array_param(:id, ids), Mastodon::Relationship)
14
+ perform_request_with_collection(:get, '/api/v1/accounts/relationships', { 'id[]': ids }, Mastodon::Relationship)
15
+ end
16
+
17
+ # Get a list of pending follow requests
18
+ # @param options [Hash]
19
+ # @option options :max_id [Integer]
20
+ # @option options :since_id [Integer]
21
+ # @option options :min_id [Integer]
22
+ # @option options :limit [Integer]
23
+ # @return [Mastodon::Collection<Mastodon::Account>]
24
+ def follow_requests(options = {})
25
+ perform_request_with_collection(:get, '/api/v1/follow_requests', options, Mastodon::Account)
26
+ end
27
+
28
+ # Authorize a follow request
29
+ # @param id [Integer]
30
+ def authorize_follow_request(id)
31
+ perform_request(:post, "/api/v1/follow_requests/#{id}/authorize")
32
+ end
33
+
34
+ # Reject a follow request
35
+ # @param id [Integer]
36
+ def reject_follow_request(id)
37
+ perform_request(:post, "/api/v1/follow_requests/#{id}/reject")
14
38
  end
15
39
 
16
40
  # Follow a user
@@ -20,6 +44,13 @@ module Mastodon
20
44
  perform_request_with_object(:post, "/api/v1/accounts/#{id}/follow", {}, Mastodon::Relationship)
21
45
  end
22
46
 
47
+ # Follow a remote user
48
+ # @param uri [String] username@domain of the person you want to follow
49
+ # @return [Mastodon::Account]
50
+ def remote_follow(uri)
51
+ perform_request_with_object(:post, '/api/v1/follows', { uri: uri }, Mastodon::Account)
52
+ end
53
+
23
54
  # Unfollow a user
24
55
  # @param id [Integer]
25
56
  # @return [Mastodon::Relationship]
@@ -27,6 +58,17 @@ module Mastodon
27
58
  perform_request_with_object(:post, "/api/v1/accounts/#{id}/unfollow", {}, Mastodon::Relationship)
28
59
  end
29
60
 
61
+ # Get a list of blocked accounts
62
+ # @param options [Hash]
63
+ # @option options :max_id [Integer]
64
+ # @option options :since_id [Integer]
65
+ # @option options :min_id [Integer]
66
+ # @option options :limit [Integer]
67
+ # @return [Mastodon::Collection<Mastodon::Account>]
68
+ def blocks(options = {})
69
+ perform_request_with_collection(:get, '/api/v1/blocks', options, Mastodon::Account)
70
+ end
71
+
30
72
  # Block a user
31
73
  # @param id [Integer]
32
74
  # @return [Mastodon::Relationship]
@@ -41,6 +83,17 @@ module Mastodon
41
83
  perform_request_with_object(:post, "/api/v1/accounts/#{id}/unblock", {}, Mastodon::Relationship)
42
84
  end
43
85
 
86
+ # Get a list of muted accounts
87
+ # @param options [Hash]
88
+ # @option options :max_id [Integer]
89
+ # @option options :since_id [Integer]
90
+ # @option options :min_id [Integer]
91
+ # @option options :limit [Integer]
92
+ # @return [Mastodon::Collection<Mastodon::Account>]
93
+ def mutes(options = {})
94
+ perform_request_with_collection(:get, '/api/v1/mutes', options, Mastodon::Account)
95
+ end
96
+
44
97
  # Mute a user
45
98
  # @param id [Integer]
46
99
  # @return [Mastodon::Relationship]
@@ -54,6 +107,20 @@ module Mastodon
54
107
  def unmute(id)
55
108
  perform_request_with_object(:post, "/api/v1/accounts/#{id}/unmute", {}, Mastodon::Relationship)
56
109
  end
110
+
111
+ # Mute notifications for a status
112
+ # @param id [Integer]
113
+ # @return [Mastodon::Status]
114
+ def mute_status(id)
115
+ perform_request_with_object(:post, "/api/v1/statuses/#{id}/mute", {}, Mastodon::Status)
116
+ end
117
+
118
+ # Unmute notifications for a status
119
+ # @param id [Integer]
120
+ # @return [Mastodon::Status]
121
+ def unmute_status(id)
122
+ perform_request_with_object(:post, "/api/v1/statuses/#{id}/unmute", {}, Mastodon::Status)
123
+ end
57
124
  end
58
125
  end
59
126
  end
@@ -0,0 +1,20 @@
1
+ require 'mastodon/rest/utils'
2
+
3
+ module Mastodon
4
+ module REST
5
+ module Reports
6
+ include Mastodon::REST::Utils
7
+
8
+ # Create a report
9
+ # @param account_id [Integer]
10
+ # @param params [Hash]
11
+ # @option params :status_ids [Array<Integer>] Statuses to be included in the report
12
+ # @option params :comment [String] Description of the report
13
+ # @option params :forward [Boolean] Whether to forward a copy of the report to the origin of the account
14
+ def create_report(account_id, params = {})
15
+ params[:'status_ids[]'] = params.delete(:status_ids) if params.key?(:status_ids)
16
+ perform_request(:post, '/api/v1/reports', { account_id: account_id }.merge(params))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,6 +1,6 @@
1
1
  require 'addressable/uri'
2
2
  require 'http'
3
- require 'json'
3
+ require 'oj'
4
4
  require 'mastodon/error'
5
5
  require 'mastodon/headers'
6
6
 
@@ -14,12 +14,16 @@ module Mastodon
14
14
  @headers = Mastodon::Headers.new(@client).request_headers
15
15
  @path = @uri.path
16
16
  @options = options
17
+ @headers = @options.delete(:headers).merge @headers if @options.is_a?(Hash) && @options[:headers]
17
18
  end
18
19
 
19
20
  def perform
20
21
  options_key = @request_method == :get ? :params : :form
21
22
  response = http_client.headers(@headers).public_send(@request_method, @uri.to_s, options_key => @options)
22
- fail_or_return(response.code, response.body.empty? ? '' : response.parse)
23
+
24
+ STDERR.puts response.body if ENV['DEBUG'] == 'true'
25
+
26
+ fail_or_return(response.code, response.body.empty? ? '' : Oj.load(response.to_s, mode: :null))
23
27
  end
24
28
 
25
29
  private
@@ -30,7 +34,7 @@ module Mastodon
30
34
  end
31
35
 
32
36
  def http_client
33
- HTTP
37
+ HTTP.timeout(:per_operation, connect: @client.timeout[:connect], read: @client.timeout[:read], write: @client.timeout[:write])
34
38
  end
35
39
  end
36
40
  end
@@ -0,0 +1,43 @@
1
+ require 'mastodon/rest/utils'
2
+ require 'mastodon/scheduled_status'
3
+
4
+ module Mastodon
5
+ module REST
6
+ module ScheduledStatuses
7
+ include Mastodon::REST::Utils
8
+
9
+ # Get a list of scheduled statuses
10
+ # @param options [Hash]
11
+ # @option options :max_id [Integer]
12
+ # @option options :since_id [Integer]
13
+ # @option options :min_id [Integer]
14
+ # @option options :limit [Integer]
15
+ # @return [Mastodon::Collection<Mastodon::ScheduledStatus>]
16
+ def scheduled_statuses(options = {})
17
+ perform_request_with_collection(:get, '/api/v1/scheduled_statuses', options, Mastodon::ScheduledStatus)
18
+ end
19
+
20
+ # Retrieve a scheduled status
21
+ # @param id [Integer]
22
+ # @return [Mastodon::ScheduledStatus]
23
+ def scheduled_status(id)
24
+ perform_request_with_object(:get, "/api/v1/scheduled_statuses/#{id}", {}, Mastodon::ScheduledStatus)
25
+ end
26
+
27
+ # Update a scheduled status
28
+ # @param id [Integer]
29
+ # @param params [Hash]
30
+ # @option params :scheduled_at [String]
31
+ # @return [Mastodon::ScheduledStatus]
32
+ def update_scheduled_status(id, params = {})
33
+ perform_request_with_object(:put, "/api/v1/scheduled_statuses/#{id}", params, Mastodon::ScheduledStatus)
34
+ end
35
+
36
+ # Cancel a scheduled status
37
+ # @param id [Integer]
38
+ def delete_scheduled_status(id)
39
+ perform_request(:delete, "/api/v1/scheduled_statuses/#{id}")
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,20 @@
1
+ require 'mastodon/rest/utils'
2
+ require 'mastodon/status'
3
+
4
+ module Mastodon
5
+ module REST
6
+ module Search
7
+ include Mastodon::REST::Utils
8
+
9
+ # Search for content
10
+ # @param options [Hash]
11
+ # @option options :q [String] The search query
12
+ # @option options :resolve [Boolean] Whether to resolve non-local accounts
13
+ # @option options :limit [Integer]
14
+ # @return [Mastodon::Results]
15
+ def search(query, options = {})
16
+ perform_request_with_object(:get, '/api/v2/search', { q: query }.merge(options), Mastodon::Results)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -8,11 +8,20 @@ module Mastodon
8
8
 
9
9
  # Create new status
10
10
  # @param text [String]
11
- # @param in_reply_to_id [Integer]
12
- # @param media_ids [Array<Integer>]
13
- # @return [Mastodon::Status]
14
- def create_status(text, in_reply_to_id = nil, media_ids = [])
15
- perform_request_with_object(:post, '/api/v1/statuses', array_param(:media_ids, media_ids).merge(status: text, in_reply_to_id: in_reply_to_id), Mastodon::Status)
11
+ # @param params [Hash]
12
+ # @option params :in_reply_to_id [Integer]
13
+ # @option params :media_ids [Array<Integer>]
14
+ # @option params :visibility [String]
15
+ # @option params :language [String]
16
+ # @option params :sensitive [Boolean]
17
+ # @option params :spoiler_text [String]
18
+ # @option params :scheduled_at [String]
19
+ # @return <Mastodon::Status>
20
+ def create_status(text, params = {})
21
+ params[:status] = text
22
+ params[:'media_ids[]'] = params.delete(:media_ids) if params.key?(:media_ids)
23
+
24
+ perform_request_with_object(:post, '/api/v1/statuses', params, Mastodon::Status)
16
25
  end
17
26
 
18
27
  # Retrieve status
@@ -57,12 +66,55 @@ module Mastodon
57
66
  perform_request_with_object(:post, "/api/v1/statuses/#{id}/unfavourite", {}, Mastodon::Status)
58
67
  end
59
68
 
69
+ # Get a list of accounts that reblogged a toot
70
+ # @param id [Integer]
71
+ # @param options [Hash]
72
+ # @option options :max_id [Integer]
73
+ # @option options :since_id [Integer]
74
+ # @option options :min_id [Integer]
75
+ # @option options :limit [Integer]
76
+ # @return [Mastodon::Collection<Mastodon::Account>]
77
+ def reblogged_by(id, options = {})
78
+ perform_request_with_collection(:get, "/api/v1/statuses/#{id}/reblogged_by", options, Mastodon::Account)
79
+ end
80
+
81
+ # Get a list of accounts that favourited a toot
82
+ # @param id [Integer]
83
+ # @param options [Hash]
84
+ # @option options :max_id [Integer]
85
+ # @option options :since_id [Integer]
86
+ # @option options :min_id [Integer]
87
+ # @option options :limit [Integer]
88
+ # @return [Mastodon::Collection<Mastodon::Account>]
89
+ def favourited_by(id, options = {})
90
+ perform_request_with_collection(:get, "/api/v1/statuses/#{id}/favourited_by", options, Mastodon::Account)
91
+ end
92
+
93
+ # Pin status on own profile
94
+ # @param id [Integer]
95
+ # @return [Mastodon::Status]
96
+ def pin(id)
97
+ perform_request_with_object(:post, "/api/v1/statuses/#{id}/pin", {}, Mastodon::Status)
98
+ end
99
+
100
+ # Unpin status from own profile
101
+ # @param id [Integer]
102
+ # @return [Mastodon::Status]
103
+ def unpin(id)
104
+ perform_request_with_object(:post, "/api/v1/statuses/#{id}/unpin", {}, Mastodon::Status)
105
+ end
106
+
60
107
  # Get a list of statuses by a user
61
108
  # @param account_id [Integer]
62
109
  # @param options [Hash]
63
110
  # @option options :max_id [Integer]
64
111
  # @option options :since_id [Integer]
112
+ # @option options :min_id [Integer]
65
113
  # @option options :limit [Integer]
114
+ # @option options :only_media [Boolean]
115
+ # @option options :pinned [Boolean]
116
+ # @option options :exclude_replies [Boolean]
117
+ # @option options :exclude_reblogs [Boolean]
66
118
  # @return [Mastodon::Collection<Mastodon::Status>]
67
119
  def statuses(account_id, options = {})
68
120
  perform_request_with_collection(:get, "/api/v1/accounts/#{account_id}/statuses", options, Mastodon::Status)
@@ -7,9 +7,20 @@ module Mastodon
7
7
  include Mastodon::REST::Utils
8
8
 
9
9
  # Get "who to follow" suggestions for authenticated user
10
+ # @param options [Hash]
11
+ # @option options :max_id [Integer]
12
+ # @option options :since_id [Integer]
13
+ # @option options :min_id [Boolean]
14
+ # @option options :limit [Integer]
10
15
  # @return [Mastodon::Collection<Mastodon::Account>]
11
- def suggestions
12
- perform_request_with_collection(:get, '/api/v1/accounts/suggestions', {}, Mastodon::Account)
16
+ def suggestions(options = {})
17
+ perform_request_with_collection(:get, '/api/v1/suggestions', options, Mastodon::Account)
18
+ end
19
+
20
+ # Remove a suggestion
21
+ # @param account_id [Integer]
22
+ def delete_suggestion(account_id)
23
+ perform_request(:delete, "/api/v1/suggestions/#{account_id}")
13
24
  end
14
25
  end
15
26
  end
@@ -10,6 +10,7 @@ module Mastodon
10
10
  # @param options [Hash]
11
11
  # @option options :max_id [Integer]
12
12
  # @option options :since_id [Integer]
13
+ # @option options :min_id [Integer]
13
14
  # @option options :limit [Integer]
14
15
  # @return [Mastodon::Collection<Mastodon::Status>]
15
16
  def home_timeline(options = {})
@@ -20,7 +21,10 @@ module Mastodon
20
21
  # @param options [Hash]
21
22
  # @option options :max_id [Integer]
22
23
  # @option options :since_id [Integer]
24
+ # @option options :min_id [Integer]
23
25
  # @option options :limit [Integer]
26
+ # @option options :local [Boolean]
27
+ # @option options :only_media [Boolean]
24
28
  # @return [Mastodon::Collection<Mastodon::Status>]
25
29
  def public_timeline(options = {})
26
30
  perform_request_with_collection(:get, '/api/v1/timelines/public', options, Mastodon::Status)
@@ -31,11 +35,26 @@ module Mastodon
31
35
  # @param options [Hash]
32
36
  # @option options :max_id [Integer]
33
37
  # @option options :since_id [Integer]
38
+ # @option options :min_id [Integer]
34
39
  # @option options :limit [Integer]
40
+ # @option options :local [Boolean]
41
+ # @option options :only_media [Boolean]
35
42
  # @return [Mastodon::Collection<Mastodon::Status>]
36
43
  def hashtag_timeline(hashtag, options = {})
37
44
  perform_request_with_collection(:get, "/api/v1/timelines/tag/#{hashtag}", options, Mastodon::Status)
38
45
  end
46
+
47
+ # Retrieve statuses from a list
48
+ # @param id [String]
49
+ # @param options [Hash]
50
+ # @option options :max_id [Integer]
51
+ # @option options :since_id [Integer]
52
+ # @option options :min_id [Integer]
53
+ # @option options :limit [Integer]
54
+ # @return [Mastodon::Collection<Mastodon::Status>]
55
+ def list_timeline(id, options = {})
56
+ perform_request_with_collection(:get, "/api/v1/timelines/list/#{id}", options, Mastodon::Status)
57
+ end
39
58
  end
40
59
  end
41
60
  end
@@ -28,12 +28,12 @@ module Mastodon
28
28
  Mastodon::Collection.new(response, klass)
29
29
  end
30
30
 
31
- # Format an array of values into a query param hash
31
+ # Format an array of values into a query param
32
32
  # @param key [Symbol]
33
33
  # @param values [Enumerable]
34
- # @return [Hash]
34
+ # @return [Array]
35
35
  def array_param(key, values)
36
- values.map.with_index { |value, i| ["#{key}[#{i}]", value] }.to_h
36
+ values.map.with_index { |value, i| ["#{key}[]", value] }
37
37
  end
38
38
  end
39
39
  end