moostodon 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/mastodon.rb +8 -0
- data/lib/mastodon/account.rb +62 -0
- data/lib/mastodon/app.rb +19 -0
- data/lib/mastodon/base.rb +52 -0
- data/lib/mastodon/card.rb +43 -0
- data/lib/mastodon/client.rb +32 -0
- data/lib/mastodon/collection.rb +30 -0
- data/lib/mastodon/emoji.rb +14 -0
- data/lib/mastodon/entities/app.rb +15 -0
- data/lib/mastodon/entities/hashtag.rb +15 -0
- data/lib/mastodon/entities/media.rb +31 -0
- data/lib/mastodon/entities/mention.rb +17 -0
- data/lib/mastodon/error.rb +37 -0
- data/lib/mastodon/headers.rb +20 -0
- data/lib/mastodon/instance.rb +25 -0
- data/lib/mastodon/list.rb +17 -0
- data/lib/mastodon/media.rb +37 -0
- data/lib/mastodon/notification.rb +32 -0
- data/lib/mastodon/relationship.rb +38 -0
- data/lib/mastodon/rest/accounts.rb +71 -0
- data/lib/mastodon/rest/api.rb +29 -0
- data/lib/mastodon/rest/apps.rb +28 -0
- data/lib/mastodon/rest/client.rb +13 -0
- data/lib/mastodon/rest/instances.rb +19 -0
- data/lib/mastodon/rest/media.rb +42 -0
- data/lib/mastodon/rest/notifications.rb +19 -0
- data/lib/mastodon/rest/relationships.rb +77 -0
- data/lib/mastodon/rest/request.rb +54 -0
- data/lib/mastodon/rest/search.rb +28 -0
- data/lib/mastodon/rest/statuses.rb +130 -0
- data/lib/mastodon/rest/suggestions.rb +19 -0
- data/lib/mastodon/rest/timelines.rb +47 -0
- data/lib/mastodon/rest/utils.rb +42 -0
- data/lib/mastodon/results.rb +19 -0
- data/lib/mastodon/status.rb +94 -0
- data/lib/mastodon/streaming/client.rb +103 -0
- data/lib/mastodon/streaming/connection.rb +47 -0
- data/lib/mastodon/streaming/deleted_status.rb +17 -0
- data/lib/mastodon/streaming/message_parser.rb +21 -0
- data/lib/mastodon/streaming/response.rb +45 -0
- data/lib/mastodon/version.rb +32 -0
- data/moostodon.gemspec +25 -0
- metadata +156 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 36477f3200abc7c0778ee098a84ec63f934918cc
|
4
|
+
data.tar.gz: 93f1c01eaf91c6fe442c6453facbcdf995bc5b81
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d06ad7a87c7cfddb9d00ca7062ddcf74e377d29b10dc345be6a49ebf52559bac098e8da587b8e931839b0ac557e2b1c865bb38b16a4c1b5d95ed0c0f56ce046b
|
7
|
+
data.tar.gz: 4dc8a68a77d43f11739788db6bf8c47c0908f7b3f10a658ee3bb5fcfd8af1884e2537c297c5b56b4423cb88a54aec8488233419e4f2c49a523d51828ba864042
|
data/lib/mastodon.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
class Account < Mastodon::Base
|
5
|
+
# @!attribute [r] id
|
6
|
+
# @return [String]
|
7
|
+
# @!attribute [r] username
|
8
|
+
# @return [String]
|
9
|
+
# @!attribute [r] acct
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [r] display_name
|
12
|
+
# @return [String]
|
13
|
+
# @!attribute [r] url
|
14
|
+
# @return [String]
|
15
|
+
# @!attribute [r] avatar
|
16
|
+
# @return [String]
|
17
|
+
# @!attribute [r] avatar_static
|
18
|
+
# @return [String]
|
19
|
+
# @!attribute [r] header
|
20
|
+
# @return [String]
|
21
|
+
# @!attribute [r] header_static
|
22
|
+
# @return [String]
|
23
|
+
# @!attribute [r] note
|
24
|
+
# @return [String]
|
25
|
+
# @!attribute [r] followers_count
|
26
|
+
# @return [Integer]
|
27
|
+
# @!attribute [r] following_count
|
28
|
+
# @return [Integer]
|
29
|
+
# @!attribute [r] statuses_count
|
30
|
+
# @return [Integer]
|
31
|
+
# @!attribute [r] created_at
|
32
|
+
# @return [String]
|
33
|
+
# @!attribute [r] locked?
|
34
|
+
# @return [Boolean]
|
35
|
+
# @!attribute [r] moved
|
36
|
+
# @return [Mastodon::Account]
|
37
|
+
|
38
|
+
normal_attr_reader :id,
|
39
|
+
:username,
|
40
|
+
:acct,
|
41
|
+
:display_name,
|
42
|
+
:created_at,
|
43
|
+
:url,
|
44
|
+
:avatar,
|
45
|
+
:avatar_static,
|
46
|
+
:header,
|
47
|
+
:header_static,
|
48
|
+
:note,
|
49
|
+
:followers_count,
|
50
|
+
:following_count,
|
51
|
+
:statuses_count
|
52
|
+
|
53
|
+
predicate_attr_reader :locked
|
54
|
+
|
55
|
+
object_attr_reader :moved, Mastodon::Account
|
56
|
+
|
57
|
+
def initialize(attributes = {})
|
58
|
+
attributes.fetch('id')
|
59
|
+
super
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/mastodon/app.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
class App < Mastodon::Base
|
5
|
+
# @!attribute [r] client_id
|
6
|
+
# @return [String]
|
7
|
+
# @!attribute [r] client_secret
|
8
|
+
# @return [String]
|
9
|
+
# @!attribute [r] name
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [r] website
|
12
|
+
# @return [String]
|
13
|
+
|
14
|
+
normal_attr_reader :client_id,
|
15
|
+
:client_secret,
|
16
|
+
:name,
|
17
|
+
:website
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
class Base
|
5
|
+
attr_reader :attributes
|
6
|
+
|
7
|
+
alias to_h attributes
|
8
|
+
alias to_hash attributes
|
9
|
+
|
10
|
+
def initialize(attributes = {})
|
11
|
+
@attributes = attributes
|
12
|
+
end
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def normal_attr_reader(*attributes)
|
16
|
+
attributes.each do |attribute|
|
17
|
+
define_attribute_method(attribute)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def object_attr_reader(attribute, klass)
|
22
|
+
define_method(attribute) do
|
23
|
+
klass.new(@attributes[attribute.to_s])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def collection_attr_reader(attribute, klass)
|
28
|
+
define_method(attribute) do
|
29
|
+
Mastodon::Collection.new(@attributes[attribute.to_s], klass)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def predicate_attr_reader(*attributes)
|
34
|
+
attributes.each do |attribute|
|
35
|
+
define_predicate_method(attribute)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def define_predicate_method(key)
|
40
|
+
define_method("#{key}?") do
|
41
|
+
@attributes[key.to_s]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def define_attribute_method(key)
|
46
|
+
define_method(key) do
|
47
|
+
@attributes[key.to_s]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
class Card < Mastodon::Base
|
5
|
+
# @!attribute [r] url
|
6
|
+
# @return [String]
|
7
|
+
# @!attribute [r] title
|
8
|
+
# @return [String]
|
9
|
+
# @!attribute [r] description
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [r] image
|
12
|
+
# @return [String]
|
13
|
+
# @!attribute [r] type
|
14
|
+
# @return [String]
|
15
|
+
# @!attribute [r] author_name
|
16
|
+
# @return [String]
|
17
|
+
# @!attribute [r] author_url
|
18
|
+
# @return [String]
|
19
|
+
# @!attribute [r] provider_name
|
20
|
+
# @return [String]
|
21
|
+
# @!attribute [r] provider_url
|
22
|
+
# @return [String]
|
23
|
+
# @!attribute [r] html
|
24
|
+
# @return [String]
|
25
|
+
# @!attribute [r] width
|
26
|
+
# @return [String]
|
27
|
+
# @!attribute [r] height
|
28
|
+
# @return [String]
|
29
|
+
|
30
|
+
normal_attr_reader :url,
|
31
|
+
:title,
|
32
|
+
:description,
|
33
|
+
:image,
|
34
|
+
:type,
|
35
|
+
:author_name,
|
36
|
+
:author_url,
|
37
|
+
:provider_name,
|
38
|
+
:provider_url,
|
39
|
+
:html,
|
40
|
+
:width,
|
41
|
+
:height
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mastodon/version'
|
4
|
+
|
5
|
+
module Mastodon
|
6
|
+
class Client
|
7
|
+
DEFAULT_TIMEOUT = {
|
8
|
+
connect: 2,
|
9
|
+
read: 5,
|
10
|
+
write: 20
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
attr_reader :base_url, :bearer_token, :timeout
|
14
|
+
|
15
|
+
# @param options [Hash]
|
16
|
+
# @option options :base_url [String] URL of the instance you want to
|
17
|
+
# connect to
|
18
|
+
# @option options :bearer_token [String] OAuth access token for your
|
19
|
+
# authenticated user
|
20
|
+
def initialize(options = {})
|
21
|
+
@base_url = options[:base_url]
|
22
|
+
@bearer_token = options[:bearer_token]
|
23
|
+
@timeout = DEFAULT_TIMEOUT.merge(options[:timeout] || {})
|
24
|
+
end
|
25
|
+
|
26
|
+
# User agent of the client
|
27
|
+
# @return [String]
|
28
|
+
def user_agent
|
29
|
+
@user_agent ||= "MastodonRubyGem/#{Mastodon::Version}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
# Mastodon collections. Used in place of arrays.
|
5
|
+
class Collection
|
6
|
+
include ::Enumerable
|
7
|
+
|
8
|
+
def initialize(items, klass)
|
9
|
+
@collection = items.map { |attributes| klass.new(attributes) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def each(start = 0)
|
13
|
+
return to_enum(:each, start) unless block_given?
|
14
|
+
|
15
|
+
Array(@collection[start..-1]).each do |element|
|
16
|
+
yield(element)
|
17
|
+
end
|
18
|
+
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def size
|
23
|
+
@collection.size
|
24
|
+
end
|
25
|
+
|
26
|
+
def last
|
27
|
+
@collection.last
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
class Emoji < Mastodon::Base
|
5
|
+
# @!attribute [r] shortcode
|
6
|
+
# @return [String]
|
7
|
+
# @!attribute [r] static_url
|
8
|
+
# @return [String]
|
9
|
+
# @!attribute [r] url
|
10
|
+
# @return [String]
|
11
|
+
|
12
|
+
normal_attr_reader :shortcode, :static_url, :url
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
module Entities
|
5
|
+
# The application a toot was sent by.
|
6
|
+
class App < Mastodon::Base
|
7
|
+
# @!attribute [r] name
|
8
|
+
# @return [String]
|
9
|
+
# @!attribute [r] website
|
10
|
+
# @return [String]
|
11
|
+
|
12
|
+
normal_attr_reader :name, :website
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
module Entities
|
5
|
+
# Hashtags are the only searchable item inside toots.
|
6
|
+
class Hashtag < Mastodon::Base
|
7
|
+
# @!attribute [r] name
|
8
|
+
# @return [String]
|
9
|
+
# @!attribute [r] url
|
10
|
+
# @return [String]
|
11
|
+
|
12
|
+
normal_attr_reader :name, :url
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
module Entities
|
5
|
+
# Media parts of a toot, like pictures or videos.
|
6
|
+
class Media < Mastodon::Base
|
7
|
+
# @!attribute [r] id
|
8
|
+
# @return [Integer]
|
9
|
+
# @!attribute [r] url
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [r] remote_url
|
12
|
+
# @return [String]
|
13
|
+
# @!attribute [r] preview_url
|
14
|
+
# @return [String]
|
15
|
+
# @!attribute [r] type
|
16
|
+
# @return [String]
|
17
|
+
# @!attribute [r] meta
|
18
|
+
# @return [Hash]
|
19
|
+
# @!attribute [r] description
|
20
|
+
# @return [String]
|
21
|
+
|
22
|
+
normal_attr_reader :id,
|
23
|
+
:url,
|
24
|
+
:remote_url,
|
25
|
+
:preview_url,
|
26
|
+
:type,
|
27
|
+
:meta,
|
28
|
+
:description
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
module Entities
|
5
|
+
# When talking about another user.
|
6
|
+
class Mention < Mastodon::Base
|
7
|
+
# @!attribute [r] id
|
8
|
+
# @return [String] Account ID
|
9
|
+
# @!attribute [r] acct
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [r] url
|
12
|
+
# @return [String]
|
13
|
+
|
14
|
+
normal_attr_reader :id, :acct, :url
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
# General error class for Mastodon.
|
5
|
+
class Error < StandardError
|
6
|
+
ClientError = Class.new(self)
|
7
|
+
BadRequest = Class.new(ClientError)
|
8
|
+
Unauthorized = Class.new(ClientError)
|
9
|
+
Forbidden = Class.new(ClientError)
|
10
|
+
UnprocessableEntity = Class.new(ClientError)
|
11
|
+
TooManyRequests = Class.new(ClientError)
|
12
|
+
|
13
|
+
ServerError = Class.new(self)
|
14
|
+
InternalServerError = Class.new(ServerError)
|
15
|
+
BadGateway = Class.new(ServerError)
|
16
|
+
ServiceUnavailable = Class.new(ServerError)
|
17
|
+
GatewayTimeout = Class.new(ServerError)
|
18
|
+
|
19
|
+
ERRORS = {
|
20
|
+
400 => Mastodon::Error::BadRequest,
|
21
|
+
401 => Mastodon::Error::Unauthorized,
|
22
|
+
403 => Mastodon::Error::Forbidden,
|
23
|
+
422 => Mastodon::Error::UnprocessableEntity,
|
24
|
+
429 => Mastodon::Error::TooManyRequests,
|
25
|
+
500 => Mastodon::Error::InternalServerError,
|
26
|
+
502 => Mastodon::Error::BadGateway,
|
27
|
+
503 => Mastodon::Error::ServiceUnavailable,
|
28
|
+
504 => Mastodon::Error::GatewayTimeout
|
29
|
+
}.freeze
|
30
|
+
|
31
|
+
class << self
|
32
|
+
def from_response(body)
|
33
|
+
new(body['error'])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
# Class to handle headers. Important for OAuth2 to work properly.
|
5
|
+
class Headers
|
6
|
+
# @param client [Mastodon::Client]
|
7
|
+
def initialize(client)
|
8
|
+
@client = client
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [Hash]
|
12
|
+
def request_headers
|
13
|
+
{
|
14
|
+
user_agent: @client.user_agent,
|
15
|
+
accept: '*/*',
|
16
|
+
authorization: "Bearer #{@client.bearer_token}"
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mastodon
|
4
|
+
class Instance < Mastodon::Base
|
5
|
+
# @!attribute [r] uri
|
6
|
+
# @return [String]
|
7
|
+
# @!attribute [r] title
|
8
|
+
# @return [String]
|
9
|
+
# @!attribute [r] description
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [r] email
|
12
|
+
# @return [String]
|
13
|
+
# @!attribute [r] version
|
14
|
+
# @return [String]
|
15
|
+
# @!attribute [r] urls
|
16
|
+
# @return [Hash]
|
17
|
+
|
18
|
+
normal_attr_reader :uri,
|
19
|
+
:title,
|
20
|
+
:description,
|
21
|
+
:email,
|
22
|
+
:version,
|
23
|
+
:urls
|
24
|
+
end
|
25
|
+
end
|