twitch-api 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -1
- data/README.md +12 -8
- data/lib/twitch/bits_leader.rb +18 -0
- data/lib/twitch/client.rb +27 -55
- data/lib/twitch/game_analytic.rb +14 -0
- data/lib/twitch/response.rb +23 -4
- data/lib/twitch/version.rb +1 -1
- data/twitch-api.gemspec +1 -1
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13fa554e6376acacd400d0aad2e651d295c613297df4476ba7c1736b6e7640aa
|
4
|
+
data.tar.gz: 6e180eab8e7061535821922cbc6ad4c4b35e867096314a7ddf564704ea32882c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b45c4f07f653c77e3058579dac055efbcb2b1664fe1c68f63caf3715bfd8471a318bacc2d6ec49f072d0fee7686b7d72313c939e26c0e8a8bbd888137611e1a
|
7
|
+
data.tar.gz: c29bf47c2020a2b2617d1f6a54b7fda59b0544c165c5787fcbba92963dc11eeaeee2149640e8bbcaa86a4b1eca7551050d82d40ca1d6657543c8647f511f4a40
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
[![Gem](https://img.shields.io/gem/v/twitch-api.svg)](https://rubygems.org/gems/twitch-api)
|
2
|
+
[![Downloads](https://img.shields.io/gem/dt/twitch-api.svg)](https://rubygems.org/gems/twitch-api)
|
3
|
+
[![Travis](https://img.shields.io/travis/mauricew/ruby-twitch-api.svg)](https://travis-ci.org/mauricew/ruby-twitch-api)
|
4
|
+
[![License](https://img.shields.io/github/license/mauricew/ruby-twitch-api.svg)]()
|
1
5
|
# Ruby Twitch API
|
2
6
|
|
3
7
|
This library is a Ruby implementation of the [Twitch Helix API](https://dev.twitch.tv/docs/api).
|
@@ -9,6 +13,7 @@ Guaranteed supported APIs include:
|
|
9
13
|
* Helix Webhooks (coming soon)
|
10
14
|
|
11
15
|
The future may bring:
|
16
|
+
* Authentication
|
12
17
|
* PubSub
|
13
18
|
* TMI/chat
|
14
19
|
|
@@ -39,14 +44,17 @@ Or install it yourself as:
|
|
39
44
|
## Usage
|
40
45
|
A client must be initialized with your client ID or bearer access token.
|
41
46
|
```
|
42
|
-
client = Twitch::Client.new
|
47
|
+
client = Twitch::Client.new(client_id: "YOUR_CLIENT_ID")
|
43
48
|
# or
|
44
|
-
client = Twitch::Client.new
|
49
|
+
client = Twitch::Client.new(access_token: "YOUR_ACCESS_TOKEN")
|
45
50
|
```
|
46
|
-
|
51
|
+
Because data may change for certain endpoints, there is also a keyword parameter called `with_raw` that returns the raw response for any request called.
|
52
|
+
|
53
|
+
Retrieval methods take in a hash equal to the parameters of the API endpoint, and return a response object containing the data and other associated request information:
|
47
54
|
* **data** is the data you would get back. Even if it's an array of one object, it remains the same as what comes from the API.
|
48
55
|
* **rate_limit** and associated fields contain API request limit information. Clip creation counts for a second limit (duration currently unknown).
|
49
|
-
* **pagination** is
|
56
|
+
* **pagination** is a hash that appears when data can be traversed, and contains one member (*cursor*) which lets you pagniate through certain requests.
|
57
|
+
* **raw** is the raw HTTP response data when `with_raw` is true in the client.
|
50
58
|
```
|
51
59
|
# Get top live streams
|
52
60
|
client.get_streams.data
|
@@ -72,7 +80,3 @@ To install this gem onto your local machine, run `bundle exec rake install`.
|
|
72
80
|
## Contributing
|
73
81
|
|
74
82
|
Bug reports and pull requests are welcome on GitHub at https://github.com/mauricew/ruby-twitch-api.
|
75
|
-
|
76
|
-
## License
|
77
|
-
|
78
|
-
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Twitch
|
2
|
+
# A user that is a leader for bits.
|
3
|
+
class BitsLeader
|
4
|
+
# ID of the user giving bits.
|
5
|
+
attr_reader :user_id
|
6
|
+
# Ranking of the user giving bits.
|
7
|
+
# Reflects the parent object's date range.
|
8
|
+
attr_reader :rank
|
9
|
+
# Number of bits given in the parent object's date range.
|
10
|
+
attr_reader :score
|
11
|
+
|
12
|
+
def initialize(attributes = {})
|
13
|
+
@user_id = attributes['user_id']
|
14
|
+
@rank = attributes['rank']
|
15
|
+
@score = attributes['score']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/twitch/client.rb
CHANGED
@@ -3,9 +3,11 @@ require "faraday_middleware"
|
|
3
3
|
|
4
4
|
require "twitch/response"
|
5
5
|
require "twitch/api_error"
|
6
|
+
require "twitch/bits_leader"
|
6
7
|
require "twitch/clip"
|
7
8
|
require "twitch/entitlement_grant_url"
|
8
9
|
require "twitch/game"
|
10
|
+
require "twitch/game_analytic"
|
9
11
|
require "twitch/stream"
|
10
12
|
require "twitch/stream_metadata"
|
11
13
|
require "twitch/user"
|
@@ -24,7 +26,9 @@ module Twitch
|
|
24
26
|
# - access_token [String] An access token.
|
25
27
|
# Used as the Authorization header in a request.
|
26
28
|
# Any "Bearer " prefix will be stripped.
|
27
|
-
|
29
|
+
# - with_raw [Boolean] Whether to include raw HTTP response
|
30
|
+
# Intended for testing/checking API results
|
31
|
+
def initialize(client_id: nil, access_token: nil, with_raw: false)
|
28
32
|
if client_id.nil? && access_token.nil?
|
29
33
|
raise "An identifier token (client ID or bearer token) is required"
|
30
34
|
elsif !!client_id && !!access_token
|
@@ -49,83 +53,60 @@ Unpredictable behavior may follow.})
|
|
49
53
|
faraday.response :json
|
50
54
|
faraday.adapter Faraday.default_adapter
|
51
55
|
end
|
56
|
+
|
57
|
+
@with_raw = with_raw
|
52
58
|
end
|
53
59
|
|
54
60
|
def create_clip(options = {})
|
55
|
-
|
56
|
-
|
57
|
-
clip = res[:data].map { |c| Clip.new(c) }
|
58
|
-
Response.new(clip, res[:rate_limit_headers])
|
61
|
+
Response.new(Clip, post('clips', options))
|
59
62
|
end
|
60
63
|
|
61
64
|
def create_entitlement_grant_url(options = {})
|
62
|
-
|
63
|
-
|
64
|
-
entitlement_grant = res[:data].map { |e| EntitlementGrantUrl.new(e) }
|
65
|
-
Response.new(entitlement_grant, res[:rate_limit_headers])
|
65
|
+
Response.new(EntitlementGrantUrl, post('entitlements/upload', options))
|
66
66
|
end
|
67
67
|
|
68
68
|
def get_clips(options = {})
|
69
|
-
|
69
|
+
Response.new(Clip, get('clips', options))
|
70
|
+
end
|
70
71
|
|
71
|
-
|
72
|
-
Response.new(
|
72
|
+
def get_bits_leaderboard(options = {})
|
73
|
+
Response.new(BitsLeader, get('bits/leaderboard', options))
|
73
74
|
end
|
74
75
|
|
75
76
|
def get_games(options = {})
|
76
|
-
|
77
|
-
|
78
|
-
games = res[:data].map { |g| Game.new(g) }
|
79
|
-
Response.new(games, res[:rate_limit_headers])
|
77
|
+
Response.new(Game, get('games', options))
|
80
78
|
end
|
81
79
|
|
82
80
|
def get_top_games(options = {})
|
83
|
-
|
81
|
+
Response.new(Game, get('games/top', options))
|
82
|
+
end
|
84
83
|
|
85
|
-
|
86
|
-
Response.new(
|
84
|
+
def get_game_analytics(options = {})
|
85
|
+
Response.new(GameAnalytic, get('analytics/games', options))
|
87
86
|
end
|
88
87
|
|
89
88
|
def get_streams(options = {})
|
90
|
-
|
91
|
-
|
92
|
-
streams = res[:data].map { |s| Stream.new(s) }
|
93
|
-
Response.new(streams, res[:rate_limit_headers], res[:pagination])
|
89
|
+
Response.new(Stream, get('streams', options))
|
94
90
|
end
|
95
91
|
|
96
92
|
def get_streams_metadata(options = {})
|
97
|
-
|
98
|
-
|
99
|
-
stream_metadata = res[:data].map { |s| StreamMetadata.new(s) }
|
100
|
-
Response.new(stream_metadata, res[:rate_limit_headers], res[:pagination])
|
93
|
+
Response.new(StreamMetadata, get('streams/metadata', options))
|
101
94
|
end
|
102
95
|
|
103
96
|
def get_users_follows(options = {})
|
104
|
-
|
105
|
-
|
106
|
-
users = res[:data].map { |u| UserFollow.new(u) }
|
107
|
-
Response.new(users, res[:rate_limit_headers], res[:pagination])
|
97
|
+
Response.new(UserFollow, get('users/follows', options))
|
108
98
|
end
|
109
99
|
|
110
100
|
def get_users(options = {})
|
111
|
-
|
112
|
-
|
113
|
-
users = res[:data].map { |u| User.new(u) }
|
114
|
-
Response.new(users, res[:rate_limit_headers])
|
101
|
+
Response.new(User, get('users', options))
|
115
102
|
end
|
116
103
|
|
117
104
|
def update_user(options = {})
|
118
|
-
|
119
|
-
|
120
|
-
user = res[:data].map { |u| User.new(u) }
|
121
|
-
Response.new(user, res[:rate_limit_headers])
|
105
|
+
Response.new(User, put('users', options))
|
122
106
|
end
|
123
107
|
|
124
108
|
def get_videos(options = {})
|
125
|
-
|
126
|
-
|
127
|
-
videos = res[:data].map { |v| Video.new(v) }
|
128
|
-
Response.new(videos, res[:rate_limit_headers], res[:pagination])
|
109
|
+
Response.new(Video, get('videos', options))
|
129
110
|
end
|
130
111
|
|
131
112
|
private
|
@@ -150,18 +131,9 @@ Unpredictable behavior may follow.})
|
|
150
131
|
raise ApiError.new(http_res.status, http_res.body)
|
151
132
|
end
|
152
133
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
if http_res.body.key?('pagination')
|
158
|
-
pagination = http_res.body['pagination']
|
159
|
-
end
|
160
|
-
|
161
|
-
{
|
162
|
-
data: http_res.body['data'],
|
163
|
-
pagination: pagination,
|
164
|
-
rate_limit_headers: rate_limit_headers
|
134
|
+
{
|
135
|
+
http_res: http_res,
|
136
|
+
with_raw: @with_raw
|
165
137
|
}
|
166
138
|
end
|
167
139
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Twitch
|
2
|
+
# A
|
3
|
+
class GameAnalytic
|
4
|
+
# ID of the game requested.
|
5
|
+
attr_reader :game_id
|
6
|
+
# A link to a (CSV format) data report.
|
7
|
+
attr_reader :url
|
8
|
+
|
9
|
+
def initialize(attributes = {})
|
10
|
+
@game_id = attributes['game_id']
|
11
|
+
@url = attributes['URL']
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/twitch/response.rb
CHANGED
@@ -3,9 +3,17 @@ module Twitch
|
|
3
3
|
class Response
|
4
4
|
# The requested data.
|
5
5
|
attr_reader :data
|
6
|
-
# A
|
6
|
+
# A total amount of entities.
|
7
|
+
# Applies to select endpoints.
|
8
|
+
attr_reader :total
|
9
|
+
# A range of dates in which data is effective.
|
10
|
+
# Usually contains the keys start_date and end_date.
|
11
|
+
# Applies to select endpoints.
|
12
|
+
attr_reader :date_range
|
13
|
+
# A hash containing a pagination token.
|
7
14
|
# Access it with
|
8
15
|
# pagination['cursor']
|
16
|
+
# Applies to select endpoints.
|
9
17
|
attr_reader :pagination
|
10
18
|
# The total amount of calls that can be used in
|
11
19
|
# the rate limit period (one minute by default).
|
@@ -20,9 +28,18 @@ module Twitch
|
|
20
28
|
# The remaining amount of clips that can be created in
|
21
29
|
# the clip rate limit period.
|
22
30
|
attr_reader :clip_rate_limit_remaining
|
31
|
+
# The HTTP raw response
|
32
|
+
attr_reader :raw
|
23
33
|
|
24
|
-
def initialize(
|
25
|
-
|
34
|
+
def initialize(data_class, res)
|
35
|
+
http_res = res[:http_res]
|
36
|
+
@raw = http_res if res[:with_raw]
|
37
|
+
|
38
|
+
@data = http_res.body['data'].map { |d| data_class.new(d) }
|
39
|
+
|
40
|
+
rate_limit_headers = Hash[http_res.headers.select do |k,v|
|
41
|
+
k.to_s.downcase.match(/^ratelimit/)
|
42
|
+
end.map { |k,v| [k.gsub('ratelimit-', '').to_sym, v] }]
|
26
43
|
|
27
44
|
@rate_limit = rate_limit_headers[:limit].to_i
|
28
45
|
@rate_limit_remaining = rate_limit_headers[:remaining].to_i
|
@@ -33,7 +50,9 @@ module Twitch
|
|
33
50
|
@clip_rate_limit_remaining = rate_limit_headers[:'helixclipscreation-remaining']
|
34
51
|
end
|
35
52
|
|
36
|
-
@pagination = pagination
|
53
|
+
@pagination = http_res.body['pagination']
|
54
|
+
@total = http_res.body['total']
|
55
|
+
@date_range = http_res.body['date_range']
|
37
56
|
end
|
38
57
|
end
|
39
58
|
end
|
data/lib/twitch/version.rb
CHANGED
data/twitch-api.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
-
spec.add_dependency "faraday", "
|
24
|
+
spec.add_dependency "faraday", ">= 0.12.2"
|
25
25
|
spec.add_dependency "faraday_middleware", "~> 0.12"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.16"
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitch-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maurice Wahba
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.12.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.12.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: faraday_middleware
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,10 +126,12 @@ files:
|
|
126
126
|
- bin/setup
|
127
127
|
- lib/twitch-api.rb
|
128
128
|
- lib/twitch/api_error.rb
|
129
|
+
- lib/twitch/bits_leader.rb
|
129
130
|
- lib/twitch/client.rb
|
130
131
|
- lib/twitch/clip.rb
|
131
132
|
- lib/twitch/entitlement_grant_url.rb
|
132
133
|
- lib/twitch/game.rb
|
134
|
+
- lib/twitch/game_analytic.rb
|
133
135
|
- lib/twitch/response.rb
|
134
136
|
- lib/twitch/stream.rb
|
135
137
|
- lib/twitch/stream_metadata.rb
|