#!/usr/bin/env ruby require 'socket' require 'thread' require 'time' require 'kconv' CRLF = "\r\n" # analyse command line option while l = ARGV.shift case l when /^--help$/ print "usage: #{$PROGRAM_NAME} [-s SERVER] [-p PORT] [--noerr]\n" exit when /^--noerr$/ $stderr = File.open("/dev/null", "w") when /^-s$/ Server = ARGV.shift when /^-p$/ Port = ARGV.shift.to_i else Server = "chat.vmeta.jp" Port = 36800 end end # set default Server = "gibson.vmeta.jp" unless defined? Server Port = 36800 unless defined? Port TCPSocket.open(Server, Port) do |s| # Queue sendQueue = Queue.new receiveQueue = Queue.new # signal trap Signal.trap(:INT) do $stdout.print "caught SIGINT, terminating client.\n" s.write("QUIT" + CRLF) #sendQueue.push("QUIT" + CRLF) exit end # get motd until (str = s.gets) =~ /^\./ if str =~ /^\+./ $stderr.print str else print str end end loop do print "login: " user = $stdin.gets user.chomp! s.write("USER " + user + CRLF) if (str = s.gets) =~ /^\+/ $stderr.print str break else $stderr.print str end end # reveice thread receiveThread = Thread.start do while str = receiveQueue.pop if str =~ /\*MSG ./ print str.split(/ /, 9)[7] + "> " + str.split(/ /, 9)[8] else $stderr.print str end end end # send thread sendThread = Thread.start do while str = $stdin.gets case str when /^\// s.write(str.sub!(/\//, "").chomp + CRLF) #sendQueue.push(str.sub!(/\//, "").chomp + CRLF) else s.write("TALK " + str.chomp + CRLF) #sendQueue.push("TALK " + str.chomp + CRLF) end end end =begin sTh = Thread.start do while str = sendQueue.pop s.write str end end =end while s.gets receiveQueue.push $_ end end