docbrown/app/controllers/twitch_stream_updates_controller.rb
Corey Alexander ec388804df Embed Twitch Live Streaming (#2591)
* Get a job created that can create a webhook subscription for a twitch user login

* Remove ngork url

* Refactor add store the access token in the cache

* Get a controller stood up to recieve the webhooks. Now they just need to be processed

* Get User columns added and got webhook controller bones working

* Update the webhook job to use the User

* Add a way for the User to input their Twitch User Name. Plus a linter fix

* Delay webhook registration when profile is updated

* Don't add _ in username

* Use String columns

* Quick fix and add some more requests specs

* Specs for the webhook job

* Get a show page Twitch Live Streams. Just a straight embed of the Twitch Everything Embed UI. Works surprisingly well responsively, and works on all screen sizes

* Fix Gemfile.lock from merge issues

* Add support for expired tokens and add spec

* Add secrets to webhook registration and clean up spec to remove token logic

* Verify webhook secret and spec it

* Add rake task to enqueue webhook registration for all Users. This can be used from Heroku Scheduler

* Update the lease seconds to be for 5 days

* Actually lets do 7 so we can refresh twice a week and try to make sure that we can always miss one

* Hijack the existing Twitch logo instead of making a duplicate one

* Remove comment and replace with log line

* Remove some white space

* Log to Airbrake when webhook errors occur

* Move to passing in an id instead of User object

* Extract logic from Job to Service object

* Capitilize in the view

* Move out of models and into services

* Remove letover stub

* Remove one usage of Faraday

* Use HTTParty for all the HTTP here
2019-04-29 18:11:53 -04:00

44 lines
1.1 KiB
Ruby

class TwitchStreamUpdatesController < ApplicationController
skip_before_action :verify_authenticity_token
def show
if params["hub.mode"] == "denied"
airbrake_logger.error("Twitch Webhook was denied: #{params.permit('hub.mode', 'hub.reason', 'hub.topic').to_json}")
head :no_content
else
render plain: params["hub.challenge"]
end
end
def create
head :no_content
unless secret_verified?
airbrake_logger.warn("Twitch Webhook Recieved for which the webhook could not be verified")
return
end
user = User.find(params[:user_id])
if params[:data].first.present?
user.update!(currently_streaming_on: :twitch)
else
user.update!(currently_streaming_on: nil)
end
end
private
def airbrake_logger
Airbrake::AirbrakeLogger.new(Rails.logger)
end
def secret_verified?
twitch_sha = request.headers["x-hub-signature"]
digest = Digest::SHA256.new
digest << ApplicationConfig["TWITCH_WEBHOOK_SECRET"]
digest << request.raw_post
twitch_sha == "sha256=#{digest.hexdigest}"
end
end