From 1e8d916a366cc48988ee4a961a66c65d87e76df9 Mon Sep 17 00:00:00 2001 From: mewrrythekibby Date: Mon, 2 Feb 2026 15:20:52 -0600 Subject: [PATCH] * Add test script * Rename cont to windex * Add optparse options --- client.rb | 71 +++++++++++++++++++++++++++++++++--------------- server.rb | 80 ++++++++++++++++++++++++++++++++++++++++++------------- test.bash | 8 ++++++ 3 files changed, 119 insertions(+), 40 deletions(-) create mode 100755 test.bash diff --git a/client.rb b/client.rb index 4ab09bd..a515e57 100644 --- a/client.rb +++ b/client.rb @@ -2,9 +2,30 @@ require 'socket' require 'io/console' +require 'optparse' -HOST = 'localhost' -PORT = 6789 +options = { + :port => 7570, + :host => 'localhost' +} +OptionParser.new do |opt| + opt.on('-pPORT', '--port PORT', Integer, + 'Port to connect to (defaults to 7570)') do |o| + options[:port] = o + end + opt.on('-HHOST', '--host HOST', String, + 'Host to connect to (defaults to `localhost`)') do |o| + options[:host] = o + end + opt.on('-h', '--help', 'Get help with this command') do + puts opt + exit + end +end.parse!(into: options) + +HOST = options[:host] +PORT = options[:port] +#PORT = 6789 VERSION = 0.01 socket = TCPSocket.new(HOST, PORT) @@ -12,25 +33,31 @@ socket = TCPSocket.new(HOST, PORT) puts "PORT: #{PORT}" puts "HOST: #{HOST}" -#reader = Thread.new do -Thread.new do - loop do - msg = socket.gets - exit 0 unless msg - ver, msg = msg.split('|',2) - next unless ver.to_f <= VERSION - next unless msg != nil - # In message version 0.01 and lower, - # all messages are in an assumed format... - row,col,chars = msg.split('|',3) - print "\x1b[#{row};#{col}H#{chars}\x1b[A" - end -end +begin + print "\x1b[?1049h\x1b[2J\x1b[3J" # Open and clear alternate buffer -while (char = STDIN.noecho(&:getch)) - exit unless char != "\x03" # ^C - exit unless char != "\x04" # ^D - next unless char.ord >= 0x20 # Non printing - next unless char.ord != 0x7F # DEL (Non print) - socket.puts "#{VERSION}|#{char}" + #reader = Thread.new do + Thread.new do + loop do + msg = socket.gets + exit 0 unless msg + ver, msg = msg.split('|',2) + next unless ver.to_f <= VERSION + next unless msg != nil + # In message version 0.01 and lower, + # all messages are in an assumed format... + row,col,chars = msg.split('|',3) + print "\x1b[#{row};#{col}H#{chars}\x1b[A" + end + end + + while (char = STDIN.noecho(&:getch)) + exit unless char != "\x03" # ^C + exit unless char != "\x04" # ^D + next unless char.ord >= 0x20 # Non printing + next unless char.ord != 0x7F # DEL (Non print) + socket.puts "#{VERSION}|#{char}" + end +ensure + print "\x1b[?1049l" # Back to regular buffer end diff --git a/server.rb b/server.rb index 2411a42..68afea6 100644 --- a/server.rb +++ b/server.rb @@ -1,41 +1,83 @@ #!/usr/bin/env ruby require 'socket' +require 'optparse' -PORT = 6789 -ROWS = 24 -COLS = 40 +PUBLIC_HOST = '0.0.0.0' +PRIVATE_HOST = '127.0.0.1' +options = { + :port => 7570, + :host => PRIVATE_HOST, + :rows => 24, + :cols => 40, +} +OptionParser.new do |opt| + opt.on('-pPORT', '--port PORT', Integer, + 'Port to serve on (defaults to 7570)') do |o| + options[:port] = o + end + opt.on('-rROWS', '--rows ROWS', Integer, + 'The number of rows to have in the shared buffer') do |o| + options[:rows] = o + end + opt.on('-cCOLS', '--cols COLS', Integer, + 'The number of columns to have in the shared buffer') do |o| + options[:cols] = o + end + opt.on('-s', '--public', Boolean, + 'Serve publicly, rather than privately') do + options[:host] = PUBLIC_HOST + end + opt.on('-S', '--private', Boolean, + 'Serve privately, rather than publicly (default)') do + options[:host] = PRIVATE_HOST + end + opt.on('-h', '--help', 'Get help with this command') do + puts opt + exit + end +end.parse!(into: options) + +HOST = options[:host] +PORT = options[:port] + +ROWS = options[:rows] +COLS = options[:cols] VERSION = 0.01 -server = TCPServer.new(PORT) +server = TCPServer.new(HOST, PORT) sockets = [server] puts "PORT: #{PORT}" +puts "GRID SIZE: #{ROWS}r#{COLS}c" puts 'Listening...' -buffer = ' '*ROWS*COLS -cont = 0 +pre = "#{ROWS}r#{COLS}c >>> " +buffer = pre.ljust(ROWS*COLS)[0...ROWS*COLS] +windex = pre.length # Wipe your buffer clean with your write index +windex %= buffer.length -def new_buf_cont_out(buf, count, newtext) +def new_buf_wi_out(buf, wi, newtext) buf = buf.dup out = '' nti = 0 # New Text Index while nti < newtext.length out << "#{VERSION}|" - out << ((count/COLS)+1).to_s + '|' - out << ((count%COLS)+1).to_s + '|' + out << ((wi/COLS)+1).to_s + '|' + out << ((wi%COLS)+1).to_s + '|' loop do out << newtext[nti] - buf[count] = newtext[nti] - count += 1 + buf[wi] = newtext[nti] + wi += 1 nti += 1 break if nti >= newtext.length - break if count%COLS == 0 + break if wi%COLS == 0 end - count = 0 if count >= (ROWS*COLS) + wi = 0 if wi >= (ROWS*COLS) + wi %= ROWS*COLS out << "\n" end - return [buf, count, out] + return [buf, wi, out] end loop do @@ -47,8 +89,10 @@ loop do client = server.accept sockets << client puts "Connection: #{client.peeraddr}" - client.puts new_buf_cont_out(buffer,0,buffer)[2] - client.puts new_buf_cont_out(buffer,cont-1,'')[2] + client.puts new_buf_wi_out(buffer,0,buffer)[2] + if buffer.length > 1 + client.puts new_buf_wi_out(buffer,windex-1,buffer[windex-1])[2] + end next end begin @@ -69,11 +113,11 @@ loop do sck.close sockets.delete(sck) end - buffer, cont, out = new_buf_cont_out(buffer,cont,newtext) + buffer, windex, out = new_buf_wi_out(buffer,windex,newtext) clients = sockets - [server] clients.each { |c| c.puts out } #if out != '' - # puts "#{cont}: (#{(cont/COLS)+1},#{(cont%COLS)+1})" + # puts "#{windex}: (#{(windex/COLS)+1},#{(windex%COLS)+1})" #end end end diff --git a/test.bash b/test.bash new file mode 100755 index 0000000..9f52433 --- /dev/null +++ b/test.bash @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +kitty -- ruby ./server.rb & +sleep 2 +for i in $(seq 2 "$1");do + kitty -- ruby ./client.rb & +done +kitty -- ruby ./client.rb