twitch-api 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +130 -26
  3. data/lib/twitch/api_error.rb +5 -4
  4. data/lib/twitch/automod_message_status.rb +17 -0
  5. data/lib/twitch/bits_leader.rb +6 -1
  6. data/lib/twitch/category.rb +27 -0
  7. data/lib/twitch/channel.rb +46 -0
  8. data/lib/twitch/cheermote.rb +53 -0
  9. data/lib/twitch/cheermote_tier.rb +55 -0
  10. data/lib/twitch/cheermote_tier_image.rb +18 -0
  11. data/lib/twitch/cheermote_tier_images.rb +21 -0
  12. data/lib/twitch/client/custom_rewards.rb +35 -0
  13. data/lib/twitch/client/extensions.rb +20 -0
  14. data/lib/twitch/client/games.rb +20 -0
  15. data/lib/twitch/client/moderation.rb +28 -0
  16. data/lib/twitch/client/streams.rb +29 -0
  17. data/lib/twitch/client/subscriptions.rb +12 -0
  18. data/lib/twitch/client/users.rb +20 -0
  19. data/lib/twitch/client.rb +128 -92
  20. data/lib/twitch/clip.rb +10 -12
  21. data/lib/twitch/custom_reward.rb +91 -0
  22. data/lib/twitch/editor.rb +21 -0
  23. data/lib/twitch/entitlement_grant_url.rb +3 -2
  24. data/lib/twitch/extension.rb +37 -0
  25. data/lib/twitch/extensions_by_types.rb +32 -0
  26. data/lib/twitch/game.rb +4 -2
  27. data/lib/twitch/game_analytic.rb +4 -2
  28. data/lib/twitch/moderation_event.rb +33 -0
  29. data/lib/twitch/moderator.rb +20 -0
  30. data/lib/twitch/redemption.rb +35 -0
  31. data/lib/twitch/response.rb +42 -19
  32. data/lib/twitch/stream.rb +12 -12
  33. data/lib/twitch/stream_marker.rb +47 -0
  34. data/lib/twitch/stream_metadata.rb +29 -15
  35. data/lib/twitch/subscription.rb +28 -0
  36. data/lib/twitch/user.rb +8 -3
  37. data/lib/twitch/user_ban.rb +26 -0
  38. data/lib/twitch/user_follow.rb +10 -2
  39. data/lib/twitch/version.rb +3 -1
  40. data/lib/twitch/video.rb +9 -13
  41. data/lib/twitch-api.rb +3 -4
  42. metadata +58 -75
  43. data/.gitignore +0 -17
  44. data/.rspec +0 -3
  45. data/.travis.yml +0 -9
  46. data/Gemfile +0 -6
  47. data/Rakefile +0 -6
  48. data/bin/console +0 -14
  49. data/bin/setup +0 -8
  50. data/twitch-api.gemspec +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13fa554e6376acacd400d0aad2e651d295c613297df4476ba7c1736b6e7640aa
4
- data.tar.gz: 6e180eab8e7061535821922cbc6ad4c4b35e867096314a7ddf564704ea32882c
3
+ metadata.gz: bda514f18997d369233835dd22a840f0c0ba884af5371d10ce553381a672aa97
4
+ data.tar.gz: 87efa1511f0e9346e87190570e6cd0745b89daffbaef04359d7e7fb283523b67
5
5
  SHA512:
6
- metadata.gz: 7b45c4f07f653c77e3058579dac055efbcb2b1664fe1c68f63caf3715bfd8471a318bacc2d6ec49f072d0fee7686b7d72313c939e26c0e8a8bbd888137611e1a
7
- data.tar.gz: c29bf47c2020a2b2617d1f6a54b7fda59b0544c165c5787fcbba92963dc11eeaeee2149640e8bbcaa86a4b1eca7551050d82d40ca1d6657543c8647f511f4a40
6
+ metadata.gz: 638a7c88c04b0aaef5e6b17e0005ca75c312bac9a5140eaaee09e3e522d6df6ceba93c79d226ae2a255ebf7c1602b6cb3ea2335cf7bd6f7491c8ac134b9f3064
7
+ data.tar.gz: 9305290bf8b6103a0ed2497c0bc39616d919b0939763cea47e3d08c8941d44638e59a0ab93f1ff95b008f1dd32a0ffaa032d487270ddf0624ae1d25952f7d587
data/README.md CHANGED
@@ -1,28 +1,32 @@
1
1
  [![Gem](https://img.shields.io/gem/v/twitch-api.svg)](https://rubygems.org/gems/twitch-api)
2
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)]()
3
+ [![Cirrus CI - Base Branch Build Status](https://img.shields.io/cirrus/github/mauricew/ruby-twitch-api)](https://cirrus-ci.com/github/mauricew/ruby-twitch-api)
4
+ [![License](https://img.shields.io/github/license/mauricew/ruby-twitch-api.svg)](LICENSE.txt)
5
+
5
6
  # Ruby Twitch API
6
7
 
7
8
  This library is a Ruby implementation of the [Twitch Helix API](https://dev.twitch.tv/docs/api).
8
9
 
9
- The goal is to provide access for the newest supported APIs provided by Twitch, while keeping extensiblity for their future expansion. These are still in development, as is this library which should remain in pace with changes made.
10
+ The goal is to provide access for the newest supported APIs provided by Twitch,
11
+ while keeping extensibility for their future expansion.
12
+ These are still in development, as is this library which should remain in pace with changes made.
10
13
 
11
14
  Guaranteed supported APIs include:
12
- * Helix REST (full rolling support)
13
- * Helix Webhooks (coming soon)
15
+
16
+ * Helix REST (full rolling support)
17
+ * Helix Webhooks (coming soon)
14
18
 
15
19
  The future may bring:
16
- * Authentication
17
- * PubSub
18
- * TMI/chat
20
+
21
+ * PubSub
19
22
 
20
23
  These will not be considered:
21
- * Twitch kraken API
22
- * [Twitch GraphQL API](https://github.com/mauricew/twitch-graphql-api)
24
+
25
+ * [Twitch Kraken API](https://github.com/dustinlakin/twitch-rb)
26
+ * [Twitch GraphQL API](https://github.com/mauricew/twitch-graphql-api)
27
+ * [Twitch Chat (IRC/TMI)](https://github.com/EnotPoloskun/twitch-chat)
23
28
 
24
29
  ## Installation
25
- Ruby 2.1 or later compatibility is guaranteed, however the target is 2.0 and above.
26
30
 
27
31
  Add to your application's Gemfile:
28
32
 
@@ -35,27 +39,124 @@ gem 'twitch-api', :git => 'https://github.com/mauricew/ruby-twitch-api'
35
39
 
36
40
  And then execute:
37
41
 
38
- $ bundle
42
+ ```sh
43
+ $ bundle
44
+ ```
39
45
 
40
46
  Or install it yourself as:
41
47
 
42
- $ gem install twitch-api
48
+ ```sh
49
+ $ gem install twitch-api
50
+ ```
43
51
 
44
52
  ## Usage
45
- A client must be initialized with your client ID or bearer access token.
53
+
54
+ ### Authentication
55
+
56
+ [Twitch documentation](https://dev.twitch.tv/docs/authentication).
57
+
58
+ This gem uses [`twitch_oauth2` gem](https://github.com/AlexWayfer/twitch_oauth2)
59
+ for authorization and authentication, you can read more detailed documentation there
60
+ (but it's pretty simple).
61
+
62
+ The goal is in an object with credentials and re-using it between different gems,
63
+ for example for API and for chat, or for the old API and the new one.
64
+ Also a logic for tokens validation and refreshing is encapsulated in it.
65
+
66
+ One of references is [this JavaScript set of libraries](https://github.com/d-fischer/twitch).
67
+
68
+ #### Client (application) flow
69
+
70
+ This is easier flow with limited (non-personal) access.
71
+
72
+ ```ruby
73
+ tokens = TwitchOAuth2::Tokens.new(
74
+ client: {
75
+ client_id: client_id,
76
+ client_secret: client_secret
77
+ },
78
+
79
+ ## this is default
80
+ # token_type: :application,
81
+
82
+ ## this can be required by some Twitch end-points
83
+ # scopes: scopes,
84
+
85
+ ## if you already have ones
86
+ # access_token: access_token
87
+ )
88
+
89
+ twitch_client = Twitch::Client.new(tokens: tokens)
46
90
  ```
47
- client = Twitch::Client.new(client_id: "YOUR_CLIENT_ID")
48
- # or
49
- client = Twitch::Client.new(access_token: "YOUR_ACCESS_TOKEN")
91
+
92
+ #### Authorization (user) flow
93
+
94
+ This is flow required for user-specific actions.
95
+
96
+ If there are no `access_token` and `refresh_token` in `:tokens`,
97
+ `TwitchOAuth2::AuthorizeError` will be raised with `#link`.
98
+
99
+ If you have a web-application with N users, you can redirect them to this link
100
+ and use `redirect_uri` to your application for callbacks.
101
+
102
+ Otherwise, if you have something like CLI tool, you can print instructions with a link for user.
103
+
104
+ Then you can use `tokens.code = 'a code from params in redirect uri'`
105
+ and it'll store new `:access_token` and `:refresh_token`.
106
+
107
+ ```ruby
108
+ tokens = TwitchOAuth2::Tokens.new(
109
+ client: {
110
+ client_id: client_id,
111
+ client_secret: client_secret,
112
+
113
+ ## `localhost` by default, can be your application end-point
114
+ # redirect_uri: redirect_uri
115
+ },
116
+
117
+ token_type: :user,
118
+
119
+ ## this can be required by some Twitch end-points
120
+ # scopes: scopes,
121
+
122
+ ## if you already have these
123
+ # access_token: access_token,
124
+ # refresh_token: refresh_token
125
+ )
126
+
127
+ twitch_client = Twitch::Client.new(tokens: tokens)
50
128
  ```
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
129
 
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:
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.
55
- * **rate_limit** and associated fields contain API request limit information. Clip creation counts for a second limit (duration currently unknown).
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.
130
+ #### After initialization
131
+
132
+ If you've passed `refresh_token` to initialization and your `access_token` is invalid,
133
+ requests that require `access_token` will automatically refresh it.
134
+
135
+ You can access tokens:
136
+
137
+ ```ruby
138
+ twitch_client.tokens # => `TwitchOAuth2::Tokens` instance
139
+ twitch_client.tokens.access_token # => 'abcdef'
140
+ twitch_client.tokens.refresh_token # => 'ghijkl'
58
141
  ```
142
+
143
+ ### Calls
144
+
145
+ Because data may change for certain endpoints, there is also the raw response
146
+ for any request called.
147
+
148
+ Retrieval methods take in a hash equal to the parameters of the API endpoint,
149
+ and return a response object containing the data and other associated request information:
150
+
151
+ * **data** is the data you would get back. Even if it's an array of one object,
152
+ it remains the same as what comes from the API.
153
+ * **rate_limit** and associated fields contain API request limit information.
154
+ Clip creation counts for a second limit (duration currently unknown).
155
+ * **pagination** is a hash that appears when data can be traversed,
156
+ and contains one member (*cursor*) which lets you paginate through certain requests.
157
+ * **raw** is the raw HTTP response data.
158
+
159
+ ```ruby
59
160
  # Get top live streams
60
161
  client.get_streams.data
61
162
  # Get a single user
@@ -66,12 +167,15 @@ client.get_games({name: ["Heroes of the Storm", "Super Mario Odyssey"]}).data
66
167
  ```
67
168
 
68
169
  ### Error handling
69
- An *ApiError* is raised whenever an HTTP error response is returned.
170
+
171
+ An `APIError` is raised whenever an HTTP error response is returned.
70
172
  Rescue it to access the body of the response, which should include an error message.
71
173
 
72
174
  ## Development
73
175
 
74
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. (Tests require a Twitch Client ID; since cassettes exist you can use any value.)
176
+ After checking out the repo, run `bin/setup` to install dependencies.
177
+ Then, run `rake spec` to run the tests.
178
+ (Tests require a Twitch Client ID; since cassettes exist you can use any value.)
75
179
 
76
180
  You can also run `bin/console` for an interactive prompt that will allow you to experiment.
77
181
 
@@ -79,4 +183,4 @@ To install this gem onto your local machine, run `bundle exec rake install`.
79
183
 
80
184
  ## Contributing
81
185
 
82
- Bug reports and pull requests are welcome on GitHub at https://github.com/mauricew/ruby-twitch-api.
186
+ Bug reports and pull requests are welcome on [GitHub](https://github.com/mauricew/ruby-twitch-api).
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Twitch
2
4
  # An error returned by the API.
3
- class ApiError < StandardError
5
+ class APIError < StandardError
4
6
  # HTTP status code of the response.
5
7
  attr_reader :status_code
6
8
  # Body content of the response.
@@ -10,8 +12,7 @@ module Twitch
10
12
  @status_code = status_code
11
13
  @body = body
12
14
 
13
- msg = "The server returned error #{status_code}"
14
- super(msg)
15
+ super self.body['message']
15
16
  end
16
17
  end
17
- end
18
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ # A determination if AutoMod would allow a message in a particular channel's chat.
5
+ class AutomodMessageStatus
6
+ # ID of the message. Matches the field of the same name passed in the request.
7
+ attr_reader :msg_id
8
+ # Whether the message would meet AutoMod requirements for the channel.
9
+ attr_reader :is_permitted
10
+
11
+ def initialize(attributes = {})
12
+ attributes.each do |key, value|
13
+ instance_variable_set "@#{key}", value
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Twitch
2
4
  # A user that is a leader for bits.
3
5
  class BitsLeader
4
6
  # ID of the user giving bits.
5
7
  attr_reader :user_id
8
+ # Display name of the user giving bits.
9
+ attr_reader :user_name
6
10
  # Ranking of the user giving bits.
7
11
  # Reflects the parent object's date range.
8
12
  attr_reader :rank
@@ -11,8 +15,9 @@ module Twitch
11
15
 
12
16
  def initialize(attributes = {})
13
17
  @user_id = attributes['user_id']
18
+ @user_name = attributes['user_name']
14
19
  @rank = attributes['rank']
15
20
  @score = attributes['score']
16
21
  end
17
22
  end
18
- end
23
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ ## Data class for categories
5
+ class Category
6
+ ## A URL to an image of the game’s box art or streaming category.
7
+ attr_reader :box_art_url
8
+
9
+ ## The name of the game or category.
10
+ attr_reader :name
11
+
12
+ ## An ID that uniquely identifies the game or category.
13
+ attr_reader :id
14
+
15
+ ## Not always available:
16
+
17
+ ## The ID that IGDB uses to identify this game.
18
+ ## If the IGDB ID is not available to Twitch, this field is set to an empty string.
19
+ attr_reader :igdb_id
20
+
21
+ def initialize(attributes = {})
22
+ attributes.each do |key, value|
23
+ instance_variable_set "@#{key}", value
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ # Data object for Twitch channels
5
+ # https://dev.twitch.tv/docs/api/reference#get-channel-information
6
+ class Channel
7
+ # Twitch User ID of this channel owner.
8
+ attr_reader :broadcaster_id
9
+ # Broadcaster's user login name.
10
+ attr_reader :broadcaster_login
11
+ # Twitch user display name of this channel owner.
12
+ attr_reader :broadcaster_name
13
+ # Language of the channel.
14
+ # A language value is either the ISO 639-1 two-letter code for a supported stream language
15
+ # or "other".
16
+ attr_reader :broadcaster_language
17
+ # Current game ID being played on the channel .
18
+ attr_reader :game_id
19
+ # Name of the game being played on the channel.
20
+ attr_reader :game_name
21
+ # Title of the stream.
22
+ attr_reader :title
23
+ # Stream delay in seconds.
24
+ attr_reader :delay
25
+
26
+ # Some endpoints, like "Search Channels", can return different fields
27
+ attr_reader :id
28
+ attr_reader :display_name
29
+ # A Boolean value that determines whether the broadcaster is streaming live.
30
+ # Is true if the broadcaster is streaming live; otherwise, false.
31
+ attr_reader :is_live
32
+ # The tags applied to the channel.
33
+ attr_reader :tags
34
+ # A URL to a thumbnail of the broadcaster’s profile image.
35
+ attr_reader :thumbnail_url
36
+ # The UTC date and time (in RFC3339 format) of when the broadcaster started streaming.
37
+ # The string is empty if the broadcaster is not streaming live.
38
+ attr_reader :started_at
39
+
40
+ def initialize(attributes = {})
41
+ attributes.each do |key, value|
42
+ instance_variable_set "@#{key}", value
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'cheermote_tier'
4
+
5
+ module Twitch
6
+ ## Data class for Cheermotes, animated emotes that viewers can assign Bits to.
7
+ class Cheermote
8
+ ## The name portion of the Cheermote string that you use in chat to cheer Bits.
9
+ ## The full Cheermote string is the concatenation of {prefix} + {number of Bits}.
10
+ ## For example, if the prefix is “Cheer” and you want to cheer 100 Bits,
11
+ ## the full Cheermote string is Cheer100.
12
+ ## When the Cheermote string is entered in chat,
13
+ ## Twitch converts it to the image associated with the Bits tier that was cheered.
14
+ attr_reader :prefix
15
+
16
+ ## A list of tier levels that the Cheermote supports.
17
+ ## Each tier identifies the range of Bits that you can cheer at that tier level
18
+ ## and an image that graphically identifies the tier level.
19
+ attr_reader :tiers
20
+
21
+ ## The type of Cheermote. Possible values are:
22
+ ## * global_first_party — A Twitch-defined Cheermote that is shown in the Bits card.
23
+ ## * global_third_party — A Twitch-defined Cheermote that is not shown in the Bits card.
24
+ ## * channel_custom — A broadcaster-defined Cheermote.
25
+ ## * display_only — Do not use; for internal use only.
26
+ ## * sponsored — A sponsor-defined Cheermote.
27
+ ## When used, the sponsor adds additional Bits to the amount that the user cheered.
28
+ ## For example, if the user cheered Terminator100, the broadcaster might receive 110 Bits,
29
+ ## which includes the sponsor's 10 Bits contribution.
30
+ attr_reader :type
31
+
32
+ ## The order that the Cheermotes are shown in the Bits card.
33
+ ## The numbers may not be consecutive. For example, the numbers may jump from 1 to 7 to 13.
34
+ ## The order numbers are unique within a Cheermote type (for example, global_first_party)
35
+ ## but may not be unique amongst all Cheermotes in the response.
36
+ attr_reader :order
37
+
38
+ ## The date and time when this Cheermote was last updated.
39
+ attr_reader :last_updated
40
+
41
+ ## A Boolean value that indicates whether this Cheermote provides
42
+ ## a charitable contribution match during charity campaigns.
43
+ attr_reader :is_charitable
44
+
45
+ def initialize(attributes = {})
46
+ attributes.each do |key, value|
47
+ value = value.map { |tier| CheermoteTier.new(tier) } if key == 'tiers'
48
+
49
+ instance_variable_set "@#{key}", value
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'cheermote_tier_images'
4
+
5
+ module Twitch
6
+ ## Data class for Cheermote Tier.
7
+ ## Each tier identifies the range of Bits that you can cheer at that tier level
8
+ ## and an image that graphically identifies the tier level.
9
+ class CheermoteTier
10
+ ## The minimum number of Bits that you must cheer at this tier level.
11
+ ## The maximum number of Bits that you can cheer at this level
12
+ ## is determined by the required minimum Bits of the next tier level minus 1.
13
+ ## For example, if `min_bits` is 1 and `min_bits` for the next tier is 100,
14
+ ## the Bits range for this tier level is 1 through 99.
15
+ ## The minimum Bits value of the last tier is the maximum number of Bits you can cheer
16
+ ## using this Cheermote. For example, 10000.
17
+ attr_reader :min_bits
18
+
19
+ ## The tier level. Possible tiers are:
20
+ ## * 1
21
+ ## * 100
22
+ ## * 500
23
+ ## * 1000
24
+ ## * 5000
25
+ ## * 10000
26
+ ## * 100000
27
+ attr_reader :id
28
+
29
+ ## The hex code of the color associated with this tier level (for example, `#979797`).
30
+ attr_reader :color
31
+
32
+ ## The animated and static image sets for the Cheermote.
33
+ ## The dictionary of images is organized by theme, format, and size.
34
+ ## The theme keys are `dark` and `light`.
35
+ ## Each theme is a dictionary of formats: `animated` and `static`.
36
+ ## Each format is a dictionary of sizes: `1`, `1.5`, `2`, `3`, and `4`.
37
+ ## The value of each size contains the URL to the image.
38
+ attr_reader :images
39
+
40
+ ## A Boolean value that determines whether users can cheer at this tier level.
41
+ attr_reader :can_cheer
42
+
43
+ ## A Boolean value that determines whether this tier level is shown in the Bits card.
44
+ ## Is `true` if this tier level is shown in the Bits card.
45
+ attr_reader :show_in_bits_card
46
+
47
+ def initialize(attributes = {})
48
+ attributes.each do |key, value|
49
+ value = CheermoteTierImages.new(value) if key == 'images'
50
+
51
+ instance_variable_set "@#{key}", value
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ ## Data class for Cheermote Tier image, static and animated
5
+ class CheermoteTierImage
6
+ ## Each theme is a dictionary of formats: `animated` and `static`.
7
+ ## Each format is a dictionary of sizes: `1`, `1.5`, `2`, `3`, and `4`.
8
+ ## The value of each size contains the URL to the image.
9
+ attr_reader :animated
10
+ attr_reader :static
11
+
12
+ def initialize(attributes = {})
13
+ attributes.each do |key, value|
14
+ instance_variable_set "@#{key}", value
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'cheermote_tier_image'
4
+
5
+ module Twitch
6
+ ## Data class for Cheermote Tier images by themes
7
+ class CheermoteTierImages
8
+ ## The theme keys are `dark` and `light`.
9
+ ## Each theme is a dictionary of formats: `animated` and `static`.
10
+ ## Each format is a dictionary of sizes: `1`, `1.5`, `2`, `3`, and `4`.
11
+ ## The value of each size contains the URL to the image.
12
+ attr_reader :dark
13
+ attr_reader :light
14
+
15
+ def initialize(attributes = {})
16
+ attributes.each do |key, value|
17
+ instance_variable_set "@#{key}", CheermoteTierImage.new(value)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ class Client
5
+ ## API methods for custom rewards
6
+ module CustomRewards
7
+ def create_custom_reward(options = {})
8
+ initialize_response CustomReward, post('channel_points/custom_rewards', options)
9
+ end
10
+
11
+ def get_custom_reward(options = {})
12
+ initialize_response CustomReward, get('channel_points/custom_rewards', options)
13
+ end
14
+
15
+ def delete_custom_reward(options = {})
16
+ initialize_response CustomReward, delete('channel_points/custom_rewards', options)
17
+ end
18
+
19
+ def get_custom_reward_redemption(options = {})
20
+ initialize_response CustomReward, get('channel_points/custom_rewards/redemptions', options)
21
+ end
22
+
23
+ def update_custom_reward(options = {})
24
+ initialize_response CustomReward, patch('channel_points/custom_rewards', options)
25
+ end
26
+
27
+ def update_redemption_status(options = {})
28
+ initialize_response(
29
+ CustomReward,
30
+ patch('channel_points/custom_rewards/redemptions', options)
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ class Client
5
+ # API methods for extensions
6
+ module Extensions
7
+ def get_user_extensions(options = {})
8
+ initialize_response Extension, get('users/extensions/list', options)
9
+ end
10
+
11
+ def get_user_active_extensions(options = {})
12
+ initialize_response ExtensionsByTypes, get('users/extensions', options)
13
+ end
14
+
15
+ def update_user_extensions(options = {})
16
+ initialize_response ExtensionsByTypes, put('users/extensions', options)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ class Client
5
+ ## API method for games
6
+ module Games
7
+ def get_games(options = {})
8
+ initialize_response Game, get('games', options)
9
+ end
10
+
11
+ def get_top_games(options = {})
12
+ initialize_response Game, get('games/top', options)
13
+ end
14
+
15
+ def get_game_analytics(options = {})
16
+ initialize_response GameAnalytic, get('analytics/games', options)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ class Client
5
+ # API methods for stream moderation
6
+ module Moderation
7
+ def check_automod_status(options = {})
8
+ initialize_response AutomodMessageStatus, post('moderation/enforcements/status', options)
9
+ end
10
+
11
+ def get_banned_events(options = {})
12
+ initialize_response ModerationEvent, get('moderation/banned/events', options)
13
+ end
14
+
15
+ def get_banned_users(options = {})
16
+ initialize_response UserBan, get('moderation/banned', options)
17
+ end
18
+
19
+ def get_moderators(options = {})
20
+ initialize_response Moderator, get('moderation/moderators', options)
21
+ end
22
+
23
+ def get_moderator_events(options = {})
24
+ initialize_response ModerationEvent, get('moderation/moderators/events', options)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ class Client
5
+ ## API method for streams
6
+ module Streams
7
+ def create_stream_marker(options = {})
8
+ initialize_response StreamMarker, post('streams/markers', options)
9
+ end
10
+
11
+ def get_stream_markers(options = {})
12
+ initialize_response StreamMarkerResponse, get('streams/markers', options)
13
+ end
14
+
15
+ def get_streams(options = {})
16
+ initialize_response Stream, get('streams', options)
17
+ end
18
+
19
+ ## TODO: Can't find this method in documentation, test it
20
+ def get_streams_metadata(options = {})
21
+ initialize_response StreamMetadata, get('streams/metadata', options)
22
+ end
23
+
24
+ def get_stream_key(options = {})
25
+ initialize_response nil, get('streams/key', options)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ class Client
5
+ # API methods for subscriptions
6
+ module Subscriptions
7
+ def get_broadcaster_subscription(options = {})
8
+ initialize_response Subscription, post('subscriptions', options)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twitch
4
+ class Client
5
+ ## API method for users
6
+ module Users
7
+ def get_users_follows(options = {})
8
+ initialize_response UserFollow, get('users/follows', options)
9
+ end
10
+
11
+ def get_users(options = {})
12
+ initialize_response User, get('users', options)
13
+ end
14
+
15
+ def update_user(options = {})
16
+ initialize_response User, put('users', options)
17
+ end
18
+ end
19
+ end
20
+ end