Class: GitGameShow::MessageHandler
- Inherits:
-
Object
- Object
- GitGameShow::MessageHandler
- Defined in:
- lib/git_game_show/network/message_handler.rb
Overview
Handles WebSocket messages
Instance Method Summary collapse
- #broadcast(json_message, exclude = nil) ⇒ Object
- #handle_message(ws, msg) ⇒ Object
- #handle_player_disconnect(ws) ⇒ Object
-
#initialize(player_manager, game_state, renderer, server_handler) ⇒ MessageHandler
constructor
A new instance of MessageHandler.
- #set_password(password) ⇒ Object
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(, 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() rescue => e @renderer.("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 (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.(data) else @renderer.("Unknown message type: #{data['type']}", :red) end rescue JSON::ParserError => e @renderer.("Invalid message format: #{e.message}", :red) rescue => e @renderer.("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.("🔴 #{player_name} has left the game", :yellow) # Notify other players @server_handler.({ 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 |