require 'websocket-eventmachine-server' require 'sequel' require 'json' require_relative 'database/models/player' require_relative 'database/models/repo' module RepoQuest class Server def initialize(port, db_connector) @port = port @db_connector = db_connector @db = @db_connector.db # Assuming you have a method in db_connector that returns the Sequel database object end def start EM.run do WebSocket::EventMachine::Server.start(host: '0.0.0.0', port: @port) do |ws| ws.onopen do puts 'Client connected' end ws.onmessage do |msg| Fiber.new do handle_message(msg, ws) end.resume end ws.onclose do puts 'Client disconnected' end end end end private def handle_message(message, _ws) parsed_data = JSON.parse(message) user_id = parsed_data['user_id'] xp_gained = parsed_data['xp_gained'] repo_pushed_to = parsed_data['repo_pushed_to'] if user_id && xp_gained && repo_pushed_to update_player_info(user_id, xp_gained) update_repo_info(repo_pushed_to) else puts 'Invalid data received.' end rescue JSON::ParserError => e puts "Error parsing JSON: #{e.message}" end def update_player_info(user_id, xp_gained) player = Player.where(player_id: user_id).first if player player.update(player_level: player.player_level + xp_gained, times_gained_xp: player.times_gained_xp + 1) else puts "Player with ID #{user_id} not found." end end def update_repo_info(repo_pushed_to) repo = Repo.where(repo_link: repo_pushed_to).first return if repo Repo.create(repo_link: repo_pushed_to) end end end