Class: GitGameShow::MessageHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/git_game_show/network/message_handler.rb

Overview

Handles WebSocket messages

Instance Method Summary collapse

Constructor Details

#initialize(player_manager, game_state, renderer, server_handler) ⇒ MessageHandler

Returns a new instance of MessageHandler.



4
5
6
7
8
9
10
# File 'lib/git_game_show/network/message_handler.rb', line 4

def initialize(player_manager, game_state, renderer, server_handler)
  @player_manager = player_manager
  @game_state = game_state
  @renderer = renderer
  @server_handler = server_handler
  @password = nil # Will be set through setter
end

Instance Method Details

#broadcast(json_message, exclude = nil) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/git_game_show/network/message_handler.rb', line 58

def broadcast(json_message, exclude = nil)
  @player_manager.players.each do |player_name, ws|
    # Skip excluded player if specified
    next if exclude && player_name == exclude

    # Skip nil websockets
    next unless ws

    # Send with error handling for each individual player
    begin
      ws.send(json_message)
    rescue => e
      @renderer.log_message("Error sending to #{player_name}: #{e.message}", :yellow)
    end
  end
end

#handle_message(ws, msg) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/git_game_show/network/message_handler.rb', line 16

def handle_message(ws, msg)
  begin
    data = JSON.parse(msg)
    case data['type']
    when MessageType::JOIN_REQUEST
      handle_join_request(ws, data)
    when MessageType::ANSWER
      handle_answer(data)
    when MessageType::CHAT
      @server_handler.broadcast_message(data)
    else
      @renderer.log_message("Unknown message type: #{data['type']}", :red)
    end
  rescue JSON::ParserError => e
    @renderer.log_message("Invalid message format: #{e.message}", :red)
  rescue => e
    @renderer.log_message("Error processing message: #{e.message}", :red)
  end
end

#handle_player_disconnect(ws) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/git_game_show/network/message_handler.rb', line 36

def handle_player_disconnect(ws)
  # Find the player who disconnected
  player_name = @player_manager.find_player_by_ws(ws)
  return unless player_name

  # Remove the player
  @player_manager.remove_player(player_name)

  # Update the sidebar to reflect the player leaving
  @server_handler.instance_variable_get(:@sidebar)&.update_player_list(@player_manager.player_names, @player_manager.scores)

  # Log message for player leaving
  @renderer.log_message("🔴 #{player_name} has left the game", :yellow)

  # Notify other players
  @server_handler.broadcast_message({
    type: 'player_left',
    name: player_name,
    players: @player_manager.player_names
  })
end

#set_password(password) ⇒ Object



12
13
14
# File 'lib/git_game_show/network/message_handler.rb', line 12

def set_password(password)
  @password = password
end