Author: nornagon
Date: 2005-07-05 10:47:35 -0400 (Tue, 05 Jul 2005)
New Revision: 831

Modified:
   trunk/clients/ravish/haver.rb
   trunk/clients/ravish/ravish2.rb
Log:
/names like irssi! And probably some other stuff I forgot.

Modified: trunk/clients/ravish/haver.rb
===================================================================
--- trunk/clients/ravish/haver.rb       2005-07-05 07:48:19 UTC (rev 830)
+++ trunk/clients/ravish/haver.rb       2005-07-05 14:47:35 UTC (rev 831)
@@ -29,13 +29,12 @@
                        end
                        @sock.add_observer self
                        event :connected
-                       msg 'HAVER', 'ravish/0.1.0'
                end
 
                def msg *args
                        m = args.join("\t") + "\r\n"
-                       puts "C: #{m}" if DEBUG >= 2
                        @sock.put m
+                       event :message_sent, args
                end
 
                def update type, *args
@@ -45,8 +44,8 @@
                end
 
                def handle_line line
-                       puts "S: #{line}" if DEBUG >= 2
                        message = line.split(/\t/)
+                       event :message_received, message
                        cmd = message.shift
                        event ("ev_" + cmd).to_sym, message
                end

Modified: trunk/clients/ravish/ravish2.rb
===================================================================
--- trunk/clients/ravish/ravish2.rb     2005-07-05 07:48:19 UTC (rev 830)
+++ trunk/clients/ravish/ravish2.rb     2005-07-05 14:47:35 UTC (rev 831)
@@ -8,25 +8,209 @@
 Thread.abort_on_exception = true
 
 class Ravish
+       ServerPrefix = "%(bblue)-%(bwhite)!%(bblue)-%(default) "
+       
+       Palette = {
+               'bblue'         => 'bold blue on de',
+               'bwhite'        => 'bold white on de',
+               'smesg'         => 'bold green on de',
+               'cmesg'         => 'bold cyan on de',
+               'listtitle'     => 'green on de',
+               'listcid'       => 'bold green on de',
+               'listdecs'      => 'bold black on black',
+               'listitem'      => 'de on de',
+               'nickdecs'      => 'bold black on black',
+               'nick'          => 'de on de',
+               'mynick'        => 'bold de on de',
+       }
+
+       Bindings = {
+               ((0..9).to_a + ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 
'O']).collect {
+                       |k| "A-#{k}" } => :switch_window
+       }
+
        def initialize server, port=7070
                @term = Term::Visual.new
+               @term.palette.setcolors Palette
+               @term.global_prefix = self.method :global_prefix
+               @term.on_got_line self.method(:got_line)
+               Bindings.each { |k, v|
+                       if v.kind_of? Symbol
+                               v = self.method v
+                       end
+                       if k.kind_of?(Array)
+                               k.each { |key|
+                                       @term.bind key, v
+                               }
+                       else
+                               @term.bind k, v
+                       end
+               }
+               @servwin = @term.create_window('title' => 'Ravish')
+               @windows = [['(server)', @servwin]]
+               @server = server
+               @port = port
                @haver = Haver::Client.new server
                @haver.add_observer self
                @haver.start
        end
+
+       def global_prefix
+               Time.now.strftime "%H:%M:%S "
+       end
+
+       def srvmsg *args
+               args.each { |arg|
+                       @servwin.addline arg, ServerPrefix
+               }
+       end
+
+       def got_line line
+               if line =~ /^[.\/]{1,2}([^.\/].*)/
+                       # command
+                       args = $1.split(/ /)
+                       cmd = args.shift
+                       func = "user_" + cmd.upcase
+                       if self.respond_to?(func)
+                               self.send func, args
+                       else
+                               self.send 'unknown_user_cmd', cmd, args
+                       end
+               end
+       end
        
        def update type, *args
                case type
                when :connecting
-                       puts 'connecting'
+                       srvmsg "Connecting to [EMAIL PROTECTED]:[EMAIL 
PROTECTED]"
                when :connected
-                       puts 'connected'
-               when :ev_HAVER
-                       @haver.msg 'IDENT', 'nornagon'
+                       srvmsg 'Connected.'
+                       @haver.msg 'HAVER', 'Ravish/0.1.0'
+               when :message_sent
+                       srvmsg "%(cmesg)C: #{args[0].inspect}"
+               when :message_received
+                       srvmsg "%(smesg)S: #{args[0].inspect}"
+               else
+                       if type.to_s =~ /^ev_([A-Z:]+)$/
+                               if self.respond_to?(type)
+                                       self.send type, *args[0]
+                               else
+                                       self.send 'unknown_ev', $1, args[0]
+                               end
+                       end
                end
        end
+
+       ## HELPER METHODS ##
+
+       def find_window name
+               if name.kind_of?(Term::Visual::Window)
+                       @windows.rassoc(name)
+               else
+                       @windows.assoc(name)
+               end
+       end
+
+       ## TERM HANDLING ##
+
+       def switch_window ch
+               win = nil
+                  if ch == ?1 then win = 1
+               elsif ch == ?2 then win = 2
+               elsif ch == ?3 then win = 3
+               elsif ch == ?4 then win = 4
+               elsif ch == ?5 then win = 5
+               elsif ch == ?6 then win = 6
+               elsif ch == ?7 then win = 7
+               elsif ch == ?8 then win = 8
+               elsif ch == ?9 then win = 9
+               elsif ch == ?0 then win = 10
+               elsif ch == ?q then win = 11
+               elsif ch == ?w then win = 12
+               elsif ch == ?e then win = 13
+               elsif ch == ?r then win = 14
+               elsif ch == ?t then win = 15
+               elsif ch == ?y then win = 16
+               elsif ch == ?u then win = 17
+               elsif ch == ?i then win = 18
+               elsif ch == ?o then win = 19
+               else
+                       return
+               end
+               if @windows[win-1] and to = @windows[win-1][1]
+                       unless to == @term.current_window
+                               srvmsg "switching to window #{win-1} 
(A-#{ch.chr}) (#{to})"
+                               @term.switch_window to
+                       end
+               end
+       end
+
+       ## SERVER MESSAGES ##
+
+       def unknown_ev cmd, args
+               srvmsg "Unknown event received from server: #{cmd} args: " +
+                       args.inspect
+       end
+
+       def ev_HAVER server, version
+               srvmsg "Server #{server} running #{version}"
+               @haver.msg 'IDENT', 'nornagon'
+       end
+
+       def ev_HELLO nick
+               srvmsg "Server accepted uid #{nick}"
+               @nick = nick
+       end
+
+       def ev_PING data
+               @haver.msg 'PONG', data
+       end
+
+       def ev_JOIN cid, uid
+               if @nick and uid == @nick
+                       unless (win = find_window cid)
+                               win = @term.create_window('title' => cid)
+                               @windows << [cid, win]
+                               @term.switch_window win
+                       end
+                       @haver.msg 'LIST', cid, 'user'
+               end
+       end
+
+       def ev_LIST cid, ns, *users
+               if ns == 'user'
+                       listed = 'Users'
+               elsif ns == 'channel'
+                       listed = 'Channels'
+               else
+                       listed = ns
+               end
+               win = find_window(cid)[1] || @servwin
+               win.print "%(listdecs)[%(listtitle)#{listed} %(listcid)#{cid}"+
+                       "%(listdecs)]%(default)"
+               users += ['aakeuser1', 'cakeuser2', 'dake_usaaaaar', 
'fake!user',
+               'gake.user', 'fake|user']
+               users += users + ['buser']
+               users.sort!
+               win.columnize users, {'before_each' => 
'%(listdecs)[%(listitem)',
+                                                         'after_each'  => 
'%(listdecs)]%(default)'}
+       end
+
+       ## CLIENT COMMANDS ##
+
+       def unknown_user_cmd cmd, args
+               srvmsg "Unknown command: #{cmd}"
+       end
+
+       def user_JOIN args
+               @haver.msg 'JOIN', args[0]
+       end
+
+       def user_RAW args
+               @haver.msg args.shift.upcase, *args
+       end
 end
 
-ravish = Ravish.new 'hardison.net'
+ravish = Ravish.new 'localhost'
 
 EventManager.instance.run


Reply via email to