From b8893bda6ae7d419c9cc765e4e19dee64c110843 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 20 Jan 2024 21:50:55 +0800 Subject: [PATCH] Add detach to server (closed #12) --- lib/teeworlds_server.rb | 42 +++++++++++++++++++++++++++++------------ server_sample.rb | 2 +- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lib/teeworlds_server.rb b/lib/teeworlds_server.rb index 7f09941..049f80e 100644 --- a/lib/teeworlds_server.rb +++ b/lib/teeworlds_server.rb @@ -72,24 +72,14 @@ class TeeworldsServer @hooks = { chat: [] } + @thread_running = false end def on_chat(&block) @hooks[:chat].push(block) end - def run(ip, port) - @server_token = (1..4).to_a.map { |_| rand(0..255) } - @server_token = @server_token.map { |b| b.to_s(16).rjust(2, '0') }.join - puts "server token #{@server_token}" - @netbase = NetBase.new(verbose: @verbose) - NetChunk.reset - @ip = ip - @port = port - puts "listening on #{@ip}:#{@port} .." - @s = UDPSocket.new - @s.bind(@ip, @port) - @netbase.bind(@s) + def main_loop loop do tick # TODO: proper tick speed sleep @@ -107,6 +97,34 @@ class TeeworldsServer end end + def run(ip, port, options = {}) + options[:detach] = options[:detach] || false + if options[:detach] && @thread_running + puts 'Error: server already running in a thread' + return + end + @server_token = (1..4).to_a.map { |_| rand(0..255) } + @server_token = @server_token.map { |b| b.to_s(16).rjust(2, '0') }.join + puts "server token #{@server_token}" + @netbase = NetBase.new(verbose: @verbose) + NetChunk.reset + @ip = ip + @port = port + puts "listening on #{@ip}:#{@port} .." + @s = UDPSocket.new + @s.bind(@ip, @port) + @netbase.bind(@s) + + if options[:detach] + @thread_running = true + Thread.new do + main_loop + end + else + main_loop + end + end + def on_message(chunk, packet) puts "got game chunk: #{chunk}" case chunk.msg diff --git a/server_sample.rb b/server_sample.rb index 609b2b7..c5d6935 100755 --- a/server_sample.rb +++ b/server_sample.rb @@ -11,4 +11,4 @@ srv.on_chat do |context, msg| puts "[chat] #{msg.author.name}: #{msg.message}" end -srv.run('127.0.0.1', 8303) +srv.run('127.0.0.1', 8303, detach: false)