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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +97 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +373 -46
  5. data/lib/twitch/client.rb +109 -20
  6. data/lib/twitch/collection.rb +54 -8
  7. data/lib/twitch/eventsub_webhook.rb +140 -0
  8. data/lib/twitch/oauth.rb +51 -14
  9. data/lib/twitch/object.rb +93 -14
  10. data/lib/twitch/objects/ad_schedule.rb +4 -0
  11. data/lib/twitch/objects/analytics_report.rb +4 -0
  12. data/lib/twitch/objects/bits_leaderboard_entry.rb +4 -0
  13. data/lib/twitch/objects/charity_donation.rb +4 -0
  14. data/lib/twitch/objects/chat_settings.rb +4 -0
  15. data/lib/twitch/objects/cheermote.rb +4 -0
  16. data/lib/twitch/objects/content_classification_label.rb +4 -0
  17. data/lib/twitch/objects/drops_entitlement.rb +4 -0
  18. data/lib/twitch/objects/drops_entitlement_update.rb +4 -0
  19. data/lib/twitch/objects/extension.rb +4 -0
  20. data/lib/twitch/objects/extension_bits_product.rb +4 -0
  21. data/lib/twitch/objects/extension_configuration_segment.rb +4 -0
  22. data/lib/twitch/objects/extension_live_channel.rb +4 -0
  23. data/lib/twitch/objects/extension_secret.rb +4 -0
  24. data/lib/twitch/objects/extension_transaction.rb +4 -0
  25. data/lib/twitch/objects/guest_star_invite.rb +4 -0
  26. data/lib/twitch/objects/guest_star_session.rb +4 -0
  27. data/lib/twitch/objects/guest_star_settings.rb +4 -0
  28. data/lib/twitch/objects/shield_mode_status.rb +4 -0
  29. data/lib/twitch/objects/{tag.rb → team.rb} +1 -1
  30. data/lib/twitch/objects/user_active_extensions.rb +4 -0
  31. data/lib/twitch/objects/user_extension.rb +4 -0
  32. data/lib/twitch/resource.rb +29 -0
  33. data/lib/twitch/resources/ads.rb +18 -0
  34. data/lib/twitch/resources/analytics.rb +19 -0
  35. data/lib/twitch/resources/announcements.rb +1 -1
  36. data/lib/twitch/resources/automod.rb +7 -7
  37. data/lib/twitch/resources/badges.rb +2 -2
  38. data/lib/twitch/resources/banned_users.rb +3 -3
  39. data/lib/twitch/resources/bits.rb +16 -0
  40. data/lib/twitch/resources/blocked_terms.rb +3 -3
  41. data/lib/twitch/resources/channels.rb +4 -4
  42. data/lib/twitch/resources/charity_campaigns.rb +8 -0
  43. data/lib/twitch/resources/chat_settings.rb +20 -0
  44. data/lib/twitch/resources/chatters.rb +1 -1
  45. data/lib/twitch/resources/clips.rb +3 -9
  46. data/lib/twitch/resources/content_classification_labels.rb +8 -0
  47. data/lib/twitch/resources/custom_power_ups.rb +1 -1
  48. data/lib/twitch/resources/custom_reward_redemptions.rb +3 -4
  49. data/lib/twitch/resources/custom_rewards.rb +5 -5
  50. data/lib/twitch/resources/drops_entitlements.rb +17 -0
  51. data/lib/twitch/resources/emotes.rb +3 -3
  52. data/lib/twitch/resources/eventsub_conduits.rb +14 -4
  53. data/lib/twitch/resources/eventsub_subscriptions.rb +1 -1
  54. data/lib/twitch/resources/extensions.rb +99 -0
  55. data/lib/twitch/resources/games.rb +3 -3
  56. data/lib/twitch/resources/goals.rb +1 -1
  57. data/lib/twitch/resources/guest_star.rb +102 -0
  58. data/lib/twitch/resources/moderators.rb +3 -3
  59. data/lib/twitch/resources/pinned_chat_messages.rb +4 -11
  60. data/lib/twitch/resources/polls.rb +1 -1
  61. data/lib/twitch/resources/predictions.rb +1 -1
  62. data/lib/twitch/resources/raids.rb +2 -3
  63. data/lib/twitch/resources/search.rb +2 -2
  64. data/lib/twitch/resources/shield_mode.rb +18 -0
  65. data/lib/twitch/resources/shoutouts.rb +1 -1
  66. data/lib/twitch/resources/stream_markers.rb +1 -1
  67. data/lib/twitch/resources/stream_schedule.rb +4 -5
  68. data/lib/twitch/resources/streams.rb +2 -2
  69. data/lib/twitch/resources/subscriptions.rb +13 -2
  70. data/lib/twitch/resources/suspicious_users.rb +1 -1
  71. data/lib/twitch/resources/teams.rb +20 -0
  72. data/lib/twitch/resources/unban_requests.rb +2 -2
  73. data/lib/twitch/resources/users.rb +30 -34
  74. data/lib/twitch/resources/videos.rb +2 -2
  75. data/lib/twitch/resources/vips.rb +2 -2
  76. data/lib/twitch/resources/warnings.rb +2 -2
  77. data/lib/twitch/resources/whispers.rb +1 -1
  78. data/lib/twitch/version.rb +1 -1
  79. data/lib/twitch.rb +33 -10
  80. metadata +42 -46
  81. data/.env.example +0 -3
  82. data/.github/FUNDING.yml +0 -5
  83. data/.github/dependabot.yml +0 -11
  84. data/.github/workflows/ci.yml +0 -39
  85. data/.gitignore +0 -9
  86. data/.rubocop.yml +0 -16
  87. data/Gemfile +0 -13
  88. data/Gemfile.lock +0 -144
  89. data/Rakefile +0 -10
  90. data/bin/console +0 -23
  91. data/bin/setup +0 -8
  92. data/bin/smoke +0 -118
  93. data/lib/twitch/objects/banned_event.rb +0 -4
  94. data/lib/twitch/objects/followed_user.rb +0 -4
  95. data/lib/twitch/objects/hype_train_event.rb +0 -4
  96. data/lib/twitch/objects/moderator_event.rb +0 -4
  97. data/lib/twitch/resources/banned_events.rb +0 -8
  98. data/lib/twitch/resources/hype_train_events.rb +0 -10
  99. data/lib/twitch/resources/moderator_events.rb +0 -9
  100. data/lib/twitch/resources/tags.rb +0 -18
  101. data/mise.toml +0 -2
  102. 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,4 +0,0 @@
1
- module Twitch
2
- class BannedEvent < Object
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Twitch
2
- class FollowedUser < Object
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Twitch
2
- class HypeTrainEvent < Object
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Twitch
2
- class ModeratorEvent < Object
3
- end
4
- 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
@@ -1,2 +0,0 @@
1
- [tools]
2
- ruby = "4.0"
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