* 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
44 lines
1.1 KiB
Ruby
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
|