made all protocol except PC29 reject %xx characters
[spider.git] / perl / console.pl
index 35924e4c08a2a02f1f2be26dcab53a28d3be6769..50196907829e16608af9cfc0a4f95f0132efdbcb 100755 (executable)
@@ -118,6 +118,15 @@ sub show_screen
        $top->refresh();
 }
 
+# add a line to the end of the top screen
+sub addtotop
+{
+       my $inbuf = shift;
+       push @shistory, $inbuf;
+       shift @shistory if @shistory > $maxshist;
+       show_screen();
+}
+
 # handle incoming messages
 sub rec_socket
 {
@@ -129,10 +138,7 @@ sub rec_socket
                my ($sort, $call, $line) = $msg =~ /^(\w)(\S+)\|(.*)$/;
                
                if ($sort eq 'D') {
-                       push @shistory, $line;
-                       shift @shistory if @shistory > $maxshist;
-#                      $spos = @shistory if $spos >= @shistory - 1;
-                       show_screen();
+                       addtotop($line);
                } elsif ($sort eq 'Z') { # end, disconnect, go, away .....
                        cease(0);
                }         
@@ -153,10 +159,26 @@ sub rec_stdin
        #  $prbuf =~ s/\n/\\n/;
        #  print "sys: $r ($prbuf)\n";
        if (defined $r) {
+               
                if ($r eq KEY_ENTER || $r eq "\n" || $r eq "\r") {
                        
                        # save the lines
                        if ($inbuf) {
+                               # check for a pling and do a search back for a command
+                               if ($inbuf =~ /^!/o) {
+                                       my $i;
+                                       $inbuf =~ s/^!//o;
+                                       for ($i = $#khistory; $i >= 0; $i--) {
+                                               if ($khistory[$i] =~ /^$inbuf/) {
+                                                       $inbuf = $khistory[$i];
+                                                       last;
+                                               }
+                                       }
+                                       if ($i < 0) {
+                                               beep();
+                                               return;
+                                       }
+                               }
                                push @khistory, $inbuf if $inbuf;
                                shift @khistory if @khistory > $maxkhist;
                                $khistpos = @khistory;
@@ -164,6 +186,9 @@ sub rec_stdin
                                $bot->clrtoeol();
                                $bot->addstr(substr($inbuf, 0, COLS));
                        }
+
+                       # add it to the monitor window
+                       addtotop($inbuf) if $inbuf;
                
                        # send it to the cluster
                        $inbuf = " " unless $inbuf;
@@ -216,6 +241,8 @@ sub rec_stdin
                        }
                } elsif ($r eq KEY_HOME || $r eq "\001") {
                        $pos = 0;
+               } elsif ($r eq KEY_END || $r eq "\005") {
+                       $pos = $lth;
                } elsif ($r eq KEY_BACKSPACE || $r eq "\010") {
                        if ($pos > 0) {
                                my $a = substr($inbuf, 0, $pos-1);
@@ -240,6 +267,13 @@ sub rec_stdin
                                beep();
                        }
                } elsif ($r ge ' ' && $r le '~') {
+                       # move the top screen back to the bottom if you type something
+                       if ($spos < @shistory - 1) {
+                               $spos = @shistory;
+                               show_screen();
+                       }
+               
+                       # insert the character into the keyboard buffer
                        if ($pos < $lth) {
                                my $a = substr($inbuf, 0, $pos);
                                my $b = substr($inbuf, $pos);
@@ -250,11 +284,11 @@ sub rec_stdin
                        $pos++;
                        $lth++;
                } elsif ($r eq "\014" || $r eq "\022") {
-                       $scr->touchwin();
-                       $scr->refresh();
+#                      curscr()->refresh();
+                       return;
                } elsif ($r eq "\013") {
-                       $inbuf = "";
-                       $pos = $lth = 0;
+                       $inbuf = substr($inbuf, 0, $pos);
+                       $lth = length $inbuf;
                } else {
                        beep();
                }