ccbbaa 20210520: I wrote this ~20 loc irc client just because we were discussing very simple irc clients in #tcl on freenode.net . It took about 30 minutes including testing using tclircd and then on freenode. The client responds to server pings properly and won't drop out because of that.
#!/usr/bin/tclsh
#
# spartanIrcClient.tcl
#
# v0: simple irc client in 10loc or so - plp 20210520
# v0a: close application when remote closes socket
# v1: unified parametrized callback
#
# sample session:
#
# $ ./spartanIrcClient.tcl
# :card.freenode.net NOTICE * :*** Looking up your hostname...
# :card.freenode.net NOTICE * :*** Checking Ident
# :card.freenode.net NOTICE * :*** Couldn't look up your hostname
# USER nic nic * * : descr
# NICK nicnic
# : lots of server output elided
# JOIN #somechannel
# WHO #somechannel
# PRIVMSG #somechannel hi, I'm a spartan irc client
# QUIT
# [press enter to exit the session]
proc react {from to line} { ;# returns "" if nothing is to be logged
set str ""
if {($from != "stdin") && [regexp {^PING :(.*)$} $line dummy server]} {
set str "PONG :$server"; puts $from $str
}
return $str
}
proc readsock {from to {msg ""}} {
if {[gets $from line] < 0} {
if {[eof $from]} {
close $from; if {$msg != "" } {puts $to $msg}; exit 0
}
} else {
puts $to $line
set str [react $from $to $line]; if {$str != ""} {puts $to $str}
}
}
set ::s [socket -async irc.freenode.net 6667]
fconfigure $::s -blocking 0 -buffering line -encoding binary -translation binary
fileevent $::s readable "readsock $::s stdout {Remote closed socket. Quitting.}"
fconfigure stdin -blocking 0 -buffering line -encoding binary -translation binary
fileevent stdin readable "readsock stdin $::s"
vwait forever