Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!uwm.edu!bionet!agate!ucbvax!iwarp.intel.com!news From: merlyn@iwarp.intel.com (Randal L. Schwartz) Newsgroups: comp.lang.perl Subject: Another chat2 application: PDX weather! (and telnet handling) Message-ID: <1991Apr22.231548.19348@iwarp.intel.com> Date: 22 Apr 91 23:15:48 GMT Sender: news@iwarp.intel.com Reply-To: merlyn@iwarp.intel.com (Randal L. Schwartz) Organization: Stonehenge; netaccess via Intel, Beaverton, Oregon, USA Lines: 115 Here's another goodie I wired up while play-testing my chat2.pl script (published last week, I believe). It handles telnet option processing (in a trivial way), allowing you to talk directly to a telnet port without invoking 'telnet'. Look at the 'talk/listen' commands to see what it is doing. Turn $trace on to see what the interaction looks like. #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'weather' <<'END_OF_FILE' X#!/usr/bin/perl X X$trace = 0; X X$where = "pdx"; X X$| = 1; Xrequire './chat2.pl'; X X&chat'open_port('hermes.merit.edu', 23) || die "open: $!"; XMAIN: { X X$_ = &listen(10); Xlast MAIN unless /which host/i; X&talk("um-weather\r"); X$_ = &listen(5); Xlast MAIN unless /c.*change scrolling/i; X&talk("c\r"); X$_ = &listen(5); Xlast MAIN unless /4.*unlimited/i; X&talk("4\r"); X$_ = &listen(5); Xlast MAIN unless /1.*city/i; X&talk("1\r"); X$_ = &listen(5); Xlast MAIN unless /1.*selected city/i; X&talk("1\r"); X$_ = &listen(5); Xlast MAIN unless /3-letter city code/i; X&talk("$where\r"); X$_ = &listen(5); # the weather is in here somewhere X $weather = $_; X $weather =~ s/\r//g; X $weather =~ s/\s*Select an option(.|\n)+$//; Xlast MAIN unless /x.*exit program/i; X&talk("x\r"); X$_ = &listen(5); X Xprint "$where weather:\n$weather\n"; X} X&chat'close(); Xexit(0); X X Xsub talk { X local($text) = @_; X print "{$text}" if $trace; X &chat'print($text); X} X Xsub listen { X local($secs) = @_; X local($return,$tmp) = ""; X while (length($tmp = &telnet_read($secs))) { X print $tmp if $trace; X $return .= $tmp; X } X $return; X} X Xsub telnet_read { X local($secs) = @_; X &chat'expect($secs, X '^\377[\375\376](.|\n)', X q#&chat'print ("\377\374".$1); redo LOOP#, X # WON'T do these do/don't requests X '^\377[\373\374](.|\n)', 'redo LOOP', X # ignore these will/won't changes X '^\377\377', '"\377"', X # escaping the IAC X '^\377(.|\n)', 'redo LOOP', X # ignoring these X '^[^\377]+', '$&' X # return these X ); X} END_OF_FILE if test 1467 -ne `wc -c <'weather'`; then echo shar: \"'weather'\" unpacked with wrong size! fi chmod +x 'weather' # end of 'weather' fi echo shar: End of shell archive. exit 0 print "Just another Perl hacker," -- /=Randal L. Schwartz, Stonehenge Consulting Services (503)777-0095 ==========\ | on contract to Intel's iWarp project, Beaverton, Oregon, USA, Sol III | | merlyn@iwarp.intel.com ...!any-MX-mailer-like-uunet!iwarp.intel.com!merlyn | \=Cute Quote: "Intel: putting the 'backward' in 'backward compatible'..."====/