A very basic quick solution I thew together. This only works on Unix
(requires stty). If you want to play with scripting it, run once,
then edit ~/.mud_client_rc:
#!/usr/local/bin/ruby -w
require "thread"
require "socket"
require "io/wait"
def show_prompt
puts "\r\n"
print "#{$prompt} #{$output_buffer}"
$stdout.flush
end
$input_buffer = Queue.new
$output_buffer = String.new
$end_session = false
$prompt = ">"
$reader = lambda { |line| $input_buffer << line.strip }
$writer = lambda do |buffer|
$server.puts "#{buffer}\r\n"
buffer.replace("")
end
$server = TCPSocket.new(ARGV.shift || "localhost", ARGV.shift || 61676)
config = File.join(ENV["HOME"], ".mud_client_rc")
if File.exists? config
eval(File.read(config))
else
File.open(config, "w") { |file| file.puts(<<'END_CONFIG') }
# Place any code you would would like to execute inside the Ruby MUD
client at
# start-up, in this file. This file is expected to be valid Ruby
syntax.
# Set $prompt to whatever you like as long as it supports to_s().
# You can set $end_session = true to exit the program at any time.
# $reader and $writer hold lambdas that are passes the line read from
the
# server and the line read from the user, respectively.
#
# The default $reader is:
# lambda { |line| $input_buffer << line.strip }
#
# The default $writer is:
# lambda do |buffer|
# $server.puts "#{buffer}\r\n"
# buffer.replace("")
# end
END_CONFIG
end
Thread.new($server) do |socket|
while line = socket.gets
$reader[line]
end
puts "Connection closed."
exit
end
$terminal_state = `stty -g`
system "stty raw -echo"
show_prompt
until $end_session
if $stdin.ready?
character = $stdin.getc
case character
when ?\C-c
break
when ?\r, ?\n
$writer[$output_buffer]
show_prompt
else
$output_buffer << character
print character.chr
$stdout.flush
end
end
break if $end_session
unless $input_buffer.empty?
puts "\r\n"
puts "#{$input_buffer.shift}\r\n" until $input_buffer.empty?
show_prompt
end
end
puts "\r\n"
$server.close
END { system "stty #{$terminal_state}" }
__EMD__
While I was making this, I wanted a stupid simple server to play
with, so I rolled one up:
#!/usr/local/bin/ruby -w
require "gserver"
class ChattyServer < GServer
def initialize( port = 61676, *args )
super(port, *args)
end
def serve( io )
messages = Array[ "Hello there.",
"Welcome to ChattyServer.",
"Isn't this a lovely conversation we're
having?",
"Is this \e[31mred\e[0m?" ]
loop do
io.puts messages[rand(messages.size)]
sleep 5
end
end
end
server = ChattyServer.new
server.start
server.join
__EMD__
James Edward Gray II