1
0
mirror of https://github.com/jcwimer/wrestlingApp synced 2026-03-24 17:04:43 +00:00
Files
wrestlingdev.com/app/channels/match_channel.rb

89 lines
3.5 KiB
Ruby

class MatchChannel < ApplicationCable::Channel
def subscribed
@match = Match.find_by(id: params[:match_id])
Rails.logger.info "[MatchChannel] Client subscribed with match_id: #{params[:match_id]}. Match found: #{@match.present?}"
if @match
stream_for @match
else
Rails.logger.warn "[MatchChannel] Match not found for ID: #{params[:match_id]}. Subscription may fail."
# You might want to reject the subscription if the match isn't found
# reject
end
end
def unsubscribed
Rails.logger.info "[MatchChannel] Client unsubscribed for match #{@match&.id}"
end
# Called when client sends data with action: 'send_stat'
def send_stat(data)
# Explicit check for @match at the start
unless @match
Rails.logger.error "[MatchChannel] Error: send_stat called but @match is nil. Client params on sub: #{params[:match_id]}"
return # Stop if no match context
end
Rails.logger.info "[MatchChannel] Received send_stat for match #{@match.id} with data: #{data.inspect}"
# Prepare attributes to update
attributes_to_update = {}
attributes_to_update[:w1_stat] = data['new_w1_stat'] if data.key?('new_w1_stat')
attributes_to_update[:w2_stat] = data['new_w2_stat'] if data.key?('new_w2_stat')
if attributes_to_update.present?
# Persist the changes to the database
# Note: Consider background job or throttling for very high frequency updates
begin
if @match.update(attributes_to_update)
Rails.logger.info "[MatchChannel] Updated match #{@match.id} stats in DB: #{attributes_to_update.keys.join(', ')}"
# Prepare payload for broadcast (using potentially updated values from @match)
payload = {
w1_stat: @match.w1_stat,
w2_stat: @match.w2_stat
}.compact
if payload.present?
Rails.logger.info "[MatchChannel] Broadcasting DB-persisted stats to match #{@match.id} with payload: #{payload.inspect}"
MatchChannel.broadcast_to(@match, payload)
else
Rails.logger.info "[MatchChannel] Payload empty after DB update for match #{@match.id}, not broadcasting."
end
else
Rails.logger.error "[MatchChannel] Failed to update match #{@match.id} stats in DB: #{@match.errors.full_messages.join(', ')}"
end
rescue => e
Rails.logger.error "[MatchChannel] Exception during match update for #{@match.id}: #{e.message}"
Rails.logger.error e.backtrace.join("\n")
end
else
Rails.logger.info "[MatchChannel] No new stat data provided in send_stat for match #{@match.id}, not updating DB or broadcasting."
end
end
# Called when client wants the latest stats immediately after reconnect
def request_sync
unless @match
Rails.logger.error "[MatchChannel] Error: request_sync called but @match is nil. Client params on sub: #{params[:match_id]}"
return
end
payload = {
w1_stat: @match.w1_stat,
w2_stat: @match.w2_stat,
score: @match.score,
win_type: @match.win_type,
winner_name: @match.winner&.name,
winner_id: @match.winner_id,
finished: @match.finished
}.compact
if payload.present?
Rails.logger.info "[MatchChannel] request_sync transmit for match #{@match.id} with payload: #{payload.inspect}"
transmit(payload)
else
Rails.logger.info "[MatchChannel] request_sync payload empty for match #{@match.id}, not transmitting."
end
end
end