twitchrb 1.11.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +97 -0
- data/LICENSE.txt +1 -1
- data/README.md +373 -46
- data/lib/twitch/client.rb +109 -20
- data/lib/twitch/collection.rb +54 -8
- data/lib/twitch/eventsub_webhook.rb +140 -0
- data/lib/twitch/oauth.rb +51 -14
- data/lib/twitch/object.rb +93 -14
- data/lib/twitch/objects/ad_schedule.rb +4 -0
- data/lib/twitch/objects/analytics_report.rb +4 -0
- data/lib/twitch/objects/bits_leaderboard_entry.rb +4 -0
- data/lib/twitch/objects/charity_donation.rb +4 -0
- data/lib/twitch/objects/chat_settings.rb +4 -0
- data/lib/twitch/objects/cheermote.rb +4 -0
- data/lib/twitch/objects/content_classification_label.rb +4 -0
- data/lib/twitch/objects/drops_entitlement.rb +4 -0
- data/lib/twitch/objects/drops_entitlement_update.rb +4 -0
- data/lib/twitch/objects/extension.rb +4 -0
- data/lib/twitch/objects/extension_bits_product.rb +4 -0
- data/lib/twitch/objects/extension_configuration_segment.rb +4 -0
- data/lib/twitch/objects/extension_live_channel.rb +4 -0
- data/lib/twitch/objects/extension_secret.rb +4 -0
- data/lib/twitch/objects/extension_transaction.rb +4 -0
- data/lib/twitch/objects/guest_star_invite.rb +4 -0
- data/lib/twitch/objects/guest_star_session.rb +4 -0
- data/lib/twitch/objects/guest_star_settings.rb +4 -0
- data/lib/twitch/objects/shield_mode_status.rb +4 -0
- data/lib/twitch/objects/{tag.rb → team.rb} +1 -1
- data/lib/twitch/objects/user_active_extensions.rb +4 -0
- data/lib/twitch/objects/user_extension.rb +4 -0
- data/lib/twitch/resource.rb +29 -0
- data/lib/twitch/resources/ads.rb +18 -0
- data/lib/twitch/resources/analytics.rb +19 -0
- data/lib/twitch/resources/announcements.rb +1 -1
- data/lib/twitch/resources/automod.rb +7 -7
- data/lib/twitch/resources/badges.rb +2 -2
- data/lib/twitch/resources/banned_users.rb +3 -3
- data/lib/twitch/resources/bits.rb +16 -0
- data/lib/twitch/resources/blocked_terms.rb +3 -3
- data/lib/twitch/resources/channels.rb +4 -4
- data/lib/twitch/resources/charity_campaigns.rb +8 -0
- data/lib/twitch/resources/chat_settings.rb +20 -0
- data/lib/twitch/resources/chatters.rb +1 -1
- data/lib/twitch/resources/clips.rb +3 -9
- data/lib/twitch/resources/content_classification_labels.rb +8 -0
- data/lib/twitch/resources/custom_power_ups.rb +1 -1
- data/lib/twitch/resources/custom_reward_redemptions.rb +3 -4
- data/lib/twitch/resources/custom_rewards.rb +5 -5
- data/lib/twitch/resources/drops_entitlements.rb +17 -0
- data/lib/twitch/resources/emotes.rb +3 -3
- data/lib/twitch/resources/eventsub_conduits.rb +14 -4
- data/lib/twitch/resources/eventsub_subscriptions.rb +1 -1
- data/lib/twitch/resources/extensions.rb +99 -0
- data/lib/twitch/resources/games.rb +3 -3
- data/lib/twitch/resources/goals.rb +1 -1
- data/lib/twitch/resources/guest_star.rb +102 -0
- data/lib/twitch/resources/moderators.rb +3 -3
- data/lib/twitch/resources/pinned_chat_messages.rb +4 -11
- data/lib/twitch/resources/polls.rb +1 -1
- data/lib/twitch/resources/predictions.rb +1 -1
- data/lib/twitch/resources/raids.rb +2 -3
- data/lib/twitch/resources/search.rb +2 -2
- data/lib/twitch/resources/shield_mode.rb +18 -0
- data/lib/twitch/resources/shoutouts.rb +1 -1
- data/lib/twitch/resources/stream_markers.rb +1 -1
- data/lib/twitch/resources/stream_schedule.rb +4 -5
- data/lib/twitch/resources/streams.rb +2 -2
- data/lib/twitch/resources/subscriptions.rb +13 -2
- data/lib/twitch/resources/suspicious_users.rb +1 -1
- data/lib/twitch/resources/teams.rb +20 -0
- data/lib/twitch/resources/unban_requests.rb +2 -2
- data/lib/twitch/resources/users.rb +30 -34
- data/lib/twitch/resources/videos.rb +2 -2
- data/lib/twitch/resources/vips.rb +2 -2
- data/lib/twitch/resources/warnings.rb +2 -2
- data/lib/twitch/resources/whispers.rb +1 -1
- data/lib/twitch/version.rb +1 -1
- data/lib/twitch.rb +33 -10
- metadata +42 -46
- data/.env.example +0 -3
- data/.github/FUNDING.yml +0 -5
- data/.github/dependabot.yml +0 -11
- data/.github/workflows/ci.yml +0 -39
- data/.gitignore +0 -9
- data/.rubocop.yml +0 -16
- data/Gemfile +0 -13
- data/Gemfile.lock +0 -144
- data/Rakefile +0 -10
- data/bin/console +0 -23
- data/bin/setup +0 -8
- data/bin/smoke +0 -118
- data/lib/twitch/objects/banned_event.rb +0 -4
- data/lib/twitch/objects/followed_user.rb +0 -4
- data/lib/twitch/objects/hype_train_event.rb +0 -4
- data/lib/twitch/objects/moderator_event.rb +0 -4
- data/lib/twitch/resources/banned_events.rb +0 -8
- data/lib/twitch/resources/hype_train_events.rb +0 -10
- data/lib/twitch/resources/moderator_events.rb +0 -9
- data/lib/twitch/resources/tags.rb +0 -18
- data/mise.toml +0 -2
- data/twitchrb.gemspec +0 -29
data/bin/smoke
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# Hits the real Twitch API to verify the gem still matches what Twitch returns.
|
|
3
|
-
# Run before releases, or on a schedule. Unit tests use WebMock and won't catch
|
|
4
|
-
# Twitch-side schema drift; this will.
|
|
5
|
-
#
|
|
6
|
-
# Required env (load via .env):
|
|
7
|
-
# TWITCH_CLIENT_ID
|
|
8
|
-
# TWITCH_ACCESS_TOKEN # user token
|
|
9
|
-
# TWITCH_CLIENT_SECRET # only needed for app-token checks
|
|
10
|
-
#
|
|
11
|
-
# Optional env — enables write checks that actually send messages:
|
|
12
|
-
# TWITCH_SMOKE_BROADCASTER_ID # channel to post into
|
|
13
|
-
# TWITCH_SMOKE_MODERATOR_ID # must match the user/bot in the token
|
|
14
|
-
# # (also used as sender_id for chat messages)
|
|
15
|
-
#
|
|
16
|
-
# Usage:
|
|
17
|
-
# bin/smoke # run all checks
|
|
18
|
-
# bin/smoke users games # run only the named checks
|
|
19
|
-
|
|
20
|
-
require "bundler/setup"
|
|
21
|
-
require "twitch"
|
|
22
|
-
require "dotenv/load"
|
|
23
|
-
|
|
24
|
-
unless ENV["TWITCH_CLIENT_ID"] && ENV["TWITCH_ACCESS_TOKEN"]
|
|
25
|
-
abort "Missing TWITCH_CLIENT_ID / TWITCH_ACCESS_TOKEN — set them in .env"
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
client = Twitch::Client.new(
|
|
29
|
-
client_id: ENV["TWITCH_CLIENT_ID"],
|
|
30
|
-
access_token: ENV["TWITCH_ACCESS_TOKEN"]
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
app_client = nil
|
|
34
|
-
if ENV["TWITCH_CLIENT_SECRET"]
|
|
35
|
-
oauth = Twitch::OAuth.new(
|
|
36
|
-
client_id: ENV["TWITCH_CLIENT_ID"],
|
|
37
|
-
client_secret: ENV["TWITCH_CLIENT_SECRET"]
|
|
38
|
-
)
|
|
39
|
-
token = oauth.create(grant_type: "client_credentials")
|
|
40
|
-
app_client = Twitch::Client.new(client_id: ENV["TWITCH_CLIENT_ID"], access_token: token.access_token) if token
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
broadcaster_id = ENV["TWITCH_SMOKE_BROADCASTER_ID"]
|
|
44
|
-
moderator_id = ENV["TWITCH_SMOKE_MODERATOR_ID"]
|
|
45
|
-
timestamp = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
|
46
|
-
|
|
47
|
-
CHECKS = {
|
|
48
|
-
"users" => -> { client.users.retrieve(username: "twitchdev") },
|
|
49
|
-
"users_many" => -> { client.users.retrieve(usernames: [ "twitchdev", "twitch" ]) },
|
|
50
|
-
"channels" => -> { client.channels.retrieve(id: 141981764) },
|
|
51
|
-
"games" => -> { client.games.retrieve(name: "Just Chatting") },
|
|
52
|
-
"games_top" => -> { client.games.top(first: 5) },
|
|
53
|
-
"streams" => -> { client.streams.list(first: 5) },
|
|
54
|
-
"clips" => -> { client.clips.list(broadcaster_id: "141981764", first: 3) },
|
|
55
|
-
"videos" => -> { client.videos.list(user_id: "141981764", first: 3) },
|
|
56
|
-
"badges_global" => -> { client.badges.global },
|
|
57
|
-
"badges_channel" => -> { client.badges.channel(broadcaster_id: "141981764") },
|
|
58
|
-
"emotes_global" => -> { client.emotes.global },
|
|
59
|
-
"emotes_channel" => -> { client.emotes.channel(broadcaster_id: "141981764") },
|
|
60
|
-
"eventsub_list" => -> { client.eventsub_subscriptions.list },
|
|
61
|
-
|
|
62
|
-
# app-token only
|
|
63
|
-
"conduits_list" => -> { app_client && app_client.eventsub_conduits.list },
|
|
64
|
-
"app_subs_list" => -> { app_client && app_client.eventsub_subscriptions.list },
|
|
65
|
-
|
|
66
|
-
# write checks — only run when broadcaster + moderator ids are set
|
|
67
|
-
"chat_message" => -> {
|
|
68
|
-
client.chat_messages.create(
|
|
69
|
-
broadcaster_id: broadcaster_id,
|
|
70
|
-
sender_id: moderator_id,
|
|
71
|
-
message: "twitchrb smoke test #{timestamp}"
|
|
72
|
-
)
|
|
73
|
-
},
|
|
74
|
-
"announcement" => -> {
|
|
75
|
-
client.announcements.create(
|
|
76
|
-
broadcaster_id: broadcaster_id,
|
|
77
|
-
moderator_id: moderator_id,
|
|
78
|
-
message: "twitchrb smoke test announcement #{timestamp}",
|
|
79
|
-
color: "primary"
|
|
80
|
-
)
|
|
81
|
-
}
|
|
82
|
-
}.freeze
|
|
83
|
-
|
|
84
|
-
requested = ARGV.empty? ? CHECKS.keys : ARGV
|
|
85
|
-
unknown = requested - CHECKS.keys
|
|
86
|
-
abort "Unknown check(s): #{unknown.join(", ")}\nAvailable: #{CHECKS.keys.join(", ")}" if unknown.any?
|
|
87
|
-
|
|
88
|
-
failures = 0
|
|
89
|
-
write_checks = %w[chat_message announcement]
|
|
90
|
-
|
|
91
|
-
requested.each do |name|
|
|
92
|
-
if name.start_with?("conduits", "app_subs") && app_client.nil?
|
|
93
|
-
puts "- #{name.ljust(18)} skipped (no TWITCH_CLIENT_SECRET)"
|
|
94
|
-
next
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
if write_checks.include?(name) && (broadcaster_id.nil? || moderator_id.nil?)
|
|
98
|
-
puts "- #{name.ljust(18)} skipped (set TWITCH_SMOKE_BROADCASTER_ID + TWITCH_SMOKE_MODERATOR_ID)"
|
|
99
|
-
next
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
begin
|
|
103
|
-
result = CHECKS[name].call
|
|
104
|
-
count = result.respond_to?(:data) ? result.data.size : 1
|
|
105
|
-
puts "✓ #{name.ljust(18)} (#{count} record#{"s" unless count == 1})"
|
|
106
|
-
rescue => e
|
|
107
|
-
failures += 1
|
|
108
|
-
puts "✗ #{name.ljust(18)} #{e.class}: #{e.message}"
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
puts
|
|
113
|
-
if failures.zero?
|
|
114
|
-
puts "All checks passed."
|
|
115
|
-
else
|
|
116
|
-
puts "#{failures} check(s) failed."
|
|
117
|
-
exit 1
|
|
118
|
-
end
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
module Twitch
|
|
2
|
-
class BannedEventsResource < Resource
|
|
3
|
-
def list(broadcaster_id:, **params)
|
|
4
|
-
response = get_request("moderation/banned/events", params: params.merge(broadcaster_id: broadcaster_id))
|
|
5
|
-
Collection.from_response(response, type: BannedEvent)
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
end
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
module Twitch
|
|
2
|
-
class HypeTrainEventsResource < Resource
|
|
3
|
-
# Required scope: channel:read:hype_train
|
|
4
|
-
# Broadcaster ID must match the user in the OAuth token
|
|
5
|
-
def list(broadcaster_id:)
|
|
6
|
-
warn "`hype_train_events.list` is deprecated because Twitch removed GET /helix/hypetrain/events. Use `hype_train_status.retrieve` instead."
|
|
7
|
-
HypeTrainStatusResource.new(client).retrieve(broadcaster_id: broadcaster_id)
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
module Twitch
|
|
2
|
-
class ModeratorEventsResource < Resource
|
|
3
|
-
# Broadcaster ID must match the user in the OAuth token
|
|
4
|
-
def list(broadcaster_id:, **params)
|
|
5
|
-
response = get_request("moderation/moderators/events", params: params.merge(broadcaster_id: broadcaster_id))
|
|
6
|
-
Collection.from_response(response, type: ModeratorEvent)
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
module Twitch
|
|
2
|
-
class TagsResource < Resource
|
|
3
|
-
def list(**params)
|
|
4
|
-
response = get_request("tags/streams", params: params)
|
|
5
|
-
Collection.from_response(response, type: Tag)
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def stream(broadcaster_id:, **params)
|
|
9
|
-
response = get_request("streams/tags", params: params.merge(broadcaster_id: broadcaster_id))
|
|
10
|
-
Collection.from_response(response, type: Tag)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
# Required scope: channel:manage:broadcast
|
|
14
|
-
def replace(broadcaster_id:, **params)
|
|
15
|
-
put_request("streams/tags", body: params.merge(broadcaster_id: broadcaster_id))
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
data/mise.toml
DELETED
data/twitchrb.gemspec
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require_relative 'lib/twitch/version'
|
|
2
|
-
|
|
3
|
-
Gem::Specification.new do |spec|
|
|
4
|
-
spec.name = "twitchrb"
|
|
5
|
-
spec.version = Twitch::VERSION
|
|
6
|
-
spec.authors = [ "Dean Perry" ]
|
|
7
|
-
spec.email = [ "dean@deanpcmad.com" ]
|
|
8
|
-
|
|
9
|
-
spec.summary = "A Ruby library for interacting with the Twitch Helix API"
|
|
10
|
-
spec.homepage = "https://deanpcmad.com"
|
|
11
|
-
spec.license = "MIT"
|
|
12
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
|
13
|
-
|
|
14
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
|
15
|
-
spec.metadata["source_code_uri"] = "https://github.com/deanpcmad/twitchrb"
|
|
16
|
-
spec.metadata["changelog_uri"] = "https://github.com/deanpcmad/twitchrb/blob/main/CHANGELOG.md"
|
|
17
|
-
|
|
18
|
-
# Specify which files should be added to the gem when it is released.
|
|
19
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
20
|
-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
|
21
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
22
|
-
end
|
|
23
|
-
spec.bindir = "exe"
|
|
24
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
25
|
-
spec.require_paths = [ "lib" ]
|
|
26
|
-
|
|
27
|
-
spec.add_dependency "faraday", ">= 2.14.3", "< 3"
|
|
28
|
-
spec.add_dependency "ostruct", "~> 0.6.0"
|
|
29
|
-
end
|